[shell] sed 전체 단어 검색 및 바꾸기

sed를 사용하여 전체 단어를 검색하고 바꾸려면 어떻게합니까?

하기

sed -i 's/[oldtext]/[newtext]/g' <file> 

[oldtext]내가 원하지 않는 부분 일치도 대체 합니다.



답변

정규식에서 \ b는 단어 경계와 일치합니다 (즉, 첫 번째 단어 문자와 단어가 아닌 문자 사이의 위치).

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment


답변

Mac OS X에서 이러한 정규식 구문 은 전체 단어를 일치시키기 위해 sed 내에서 작동 하지 않습니다.

  • \bmyWord\b
  • \<myWord\>

지금 내 말을 듣고 나중에 믿으세요. 추악한 구문을 사용해야합니다.

  • /[[:<:]]myWord[[:>:]]/

예를 들어 전체 단어에 대해서만 mintminty 로 바꾸려면 다음을 수행하십시오 .

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

출처 : re_format 매뉴얼 페이지


답변

사용 \b단어 경계를 위해 :

sed -i 's/\boldtext\b/newtext/g' <file>


답변

내 컴퓨터 중 하나에서 ” \b“(따옴표없이)로 단어를 구분하는 것이 작동하지 않았습니다. 해결책은 \<시작 구분 기호에 ” \>“를 사용하고 종료 구분 기호에 ” “를 사용하는 것입니다.

Joakim Lundberg 의 예 를 통해 설명하려면 :

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment


답변

쉘 명령에서 :

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

또는:

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

하지만 vim에 있다면 나중에 만 사용할 수 있습니다.

:% s/\<old\>/new/g


답변

$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment


답변