sed 전체 단어 검색 및 바꾸기


120

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

하기

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

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

답변:


164

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

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


@OlegMazko 나는 또한 vim에서 사용할 posix 허용되는 방법을 찾고 왔으며 나를 위해 일한 것은 s / \ <7 // g였습니다. 내 코드에서 단어의 시작 부분에서 7을 제거하려고했습니다. 이 링크, 특히 JP의 솔루션은 다음과 같은 답을 얻었습니다 . stackoverflow.com/questions/3864467/…
jimh

당신은 내가 단어 "와"등의 대체 일을하려고 미친 거라고 감사 \band\b저장 일 :
MitchellK

144

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

  • \bmyWord\b
  • \<myWord\>

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

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

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

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

출처 : re_format 매뉴얼 페이지


19
sedMacPorts 또는 Homebrew를 통해 GNU (및 기타 모든 GNU 도구)를 설치 하고 PATH. Mac을 상당히 유용하게 만들 수 있습니다.
Jim Stewart

9
@JimStewart는 'OS X에서 OS Xers처럼 행동하라'고 가정하는 많은 도구를 깰 수있는 좋은 방법입니다. 즉, brew install coreutils모든 gnu 도구의 접두사 인을 확실히 제안 할 수 있습니다.
ELLIOTTCABLE

16
brew install gnu-sed사용gsed
k107

brew coreutils는 굉장합니다. gnu 버전의 명령 전체를 설치하는 다른 brew 패키지가 있습니까? 아니면 나머지를 개별적으로 설치해야합니까?
ckot

2
perl을 사용하는 것이 항상 더 나은 솔루션입니다 : perl -pe 's|\bone\b|two|g'. sed가 여기저기서 실패하는 동안 안정적으로 작동합니다.
Pavel Vlasov

13

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

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

3
주의 []: o,l-> [newtext],[newtext]. 당신은 분명 의미 sed -i 's/\boldtext\b/newtext/g'
JJoao

7

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

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

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

2

쉘 명령에서 :

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

또는:

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

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

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

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

OP에 "sed 사용"이 명시되어 있음
ndemou

이것은 순수 교체가 아니라 분할 조작 조인입니다. 이것은 여러 공백을 하나로 축소하고 선행 / 후행 공백을 버립니다. 예 : echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Egives no bar embarassment$.
musiphil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.