sed 교체 문제

sed 교체 문제

내 파일에 다음이 포함되어 있습니다.

$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

'탐욕스러운'는 가능한 가장 긴 문자열과 일치함을 의미합니다.

'게으른'는 가능한 가장 짧은 문자열과 일치함을 의미합니다.

관련 정보