내 파일에 다음이 포함되어 있습니다.
$Param_T=ABC49_SA_T2
$Param_V=ABC49BC_SA_V2
$Param_ST=ABC491_SA_M2
ABC*_로 시작하는 값을 XYZ12_로 바꾸려고 합니다.
sed -i 's/ABC\.*_/XYZ12_/g' INCR.parm
위는 내가 사용한 sed 명령입니다. 오류는 발생하지 않았지만 값은 변경되지 않았습니다. 누구든지 이 문제를 해결하도록 도와줄 수 있나요?
답변1
sed를 사용하여 탐욕스럽지 않은 일치를 달성하는 방법은 문자 집합을 지정하는 것입니다.아니요일치시키려는 항목:
sed -i 's/=ABC[^_]*_/=XYZ12_/g' INCR.parm
즉, "ABC" 뒤에 밑줄이 아닌 0개 이상의 문자와 밑줄이 오는 것과 일치합니다.
이 지점에서 벗어날 수는 없습니다. "네이키드" 도트는 "모든 문자와 일치"를 의미하고, 이스케이프 도트는 "리터럴 도트와 일치"를 의미합니다. 리터럴 문자열 "ABC"와 일치하는 데이터가 없기 때문에 대체를 수행하지 않았습니다.
답변2
.
모든 문자와 일치하는 ""를 이스케이프하지 마십시오 .탐욕스러운]
sed -i 's/ABC.*_/XYZ12_/g' INCR.parm
산출:
$Param_T=XYZ12_T2
$Param_V=XYZ12_V2
$Param_ST=XYZ12_M2)
첫 번째 밑줄( ) [lazy]까지만 ABC*를 바꾸려면 _
perl regex를 사용해야 합니다.
사용
perl -pe 's/ABC(.*?)_/XYZ12_/g' INCR.parm
산출:
$Param_T=XYZ12_SA_T2
$Param_V=XYZ12_SA_V2
$Param_ST=XYZ12_T2
'탐욕스러운'는 가능한 가장 긴 문자열과 일치함을 의미합니다.
'게으른'는 가능한 가장 짧은 문자열과 일치함을 의미합니다.