패턴: 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