Gnu Sed: 공백 문자 클래스가 줄 끝 문자와 일치하지 않습니다.

Gnu Sed: 공백 문자 클래스가 줄 끝 문자와 일치하지 않습니다.

패턴: abc 다음에 공백 또는 줄의 마지막 문자가 옵니다.

orig="abc[[:space:]]+";
new=Hello
sed -i -r -e "s|${orig}|${new}|g" ./file ;

문서:

abc
abcd
abc

abc d

실행 후:

abc
abcd
abc

Hellod

예상 출력:

Hello
abcd
Hello

Hello d

내가 무엇을 놓치고 있나요?


참고: 공백 문자를 유지하고 싶습니다.

답변1

만약에원하는 것은 공간을 예약하는 것입니다.

참고: 공백 문자를 유지하고 싶습니다.

그런 다음 일치하되 교체 시 복원합니다.

 orig='abc([[:space:]]+)'
 new='Hello\1'
 sed -E -e "s|${orig}|${new}|g" ./infile ;

그러면 다음과 같은 출력이 생성됩니다(수정하려면 적절한 -i옵션을 추가하세요).

 Hello  
 abcd  
 Hello   

 Hello d

물론 이는 파일의 일부 줄 끝에 공백이 있다고 가정합니다.

 $ cat infile | sed -n l
 abc  $
 abcd  $
 abc   $
 $
 abc d$

공백으로 끝나지 않는 줄을 일치시키기 위해 정규식이 필요한 경우 더 복잡한 정규식이 필요합니다.

 orig='abc([[:space:]]+|$)';
 new='Hello\1';
 sed -E -e "s,${orig},${new},g" ./infile ;

물론, 정규식에서 요구하는 교체 와의 충돌을 피하기 s|||위해 구분 기호를 변경해야 합니다 .s,,,|

답변2

공백을 일치시키고 캡처한 다음 다시 삽입할 필요가 없습니다. "abc"를 검색하면 됩니다.독립된 단어. GNU sed의 경우 \<\>단어 경계로 사용하십시오.

sed 's/\<abc\>/Hello/g' file
Hello
abcd
Hello

Hello d

패턴과 대체를 변수에 넣으려면 백슬래시를 적절하게 인용하도록 주의하면 됩니다.

pattern="\\<abc\\>"    # or: pattern='\<abc\>'
replacement=Hello
sed "s/$pattern/$replacement/" file

관련 정보