sed를 사용하여 전체 단어를 찾아 교체하세요.

sed를 사용하여 전체 단어를 찾아 교체하세요.

파일에 다음과 같은 텍스트 블록이 있습니다.

test3.legacy test4.legacy test3 test3.kami

test3나는 단지 전체적으로 검색하고 아무것도 대체하고 싶지 않습니다. 불행히도 내 모든 시도가 제거되었습니다.테스트3에서 test3.legacytest3.kami. 난 노력 했어:

sed 's/^test3://g' myfile.txt
sed 's/\btest3\b//g' myfile.txt
sed 's/\<test3\>//g' myfile.txt

행운도 없이. 이 문제를 어떻게 해결할 수 있는지 알려주세요.

편집하다:대부분의 시도는 다음과 같은 결과를 가져왔습니다..legacy test4.legacy .kami

답변1

이것이 당신이 원하는 것입니까?

$ sed 's/\(^\| \)test3\( \|$\)/\1/g' file
test3.legacy test4.legacy test3.kami

이 말은

substitute
   (^ start of line OR space)
   test3
   (space OR end of line)
with match 1 (AKA space or start of line)

업데이트:

그리고 좋은 점을 우아하게 표현한 것처럼@스테판 차젤라스이것은 특정 경우를 처리하지 않습니다. 휴대성 부분도 강조합니다. 보다아래에 답변하세요.

GNU 변종은 다음과 같은 일을 할 수 있습니다.(희망적으로), BE:

sed 's/\(^\| \)\(test3\( \|$\)\)*/\1/g'
# Or perhaps:
sed 's/\(^\| \)\(test3\( \|$\)\)\+/\1/g'

반복되는 경기를 관리합니다. 선택적으로 여러 공간 등도 관리할 수 있습니다. 입력에 따라 다릅니다.

EOUPD


아마도 대안으로 (시작점으로만 의미됨):

sed 's/\Wtest3\W/ /g'

나는 이것이 아니라고 가정합니다:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy

답변2

\s단어 경계 표기법을 사용하는 대신 예를 들어 양쪽에 공백이 있는 test3을 찾습니다 .

예를 들어

$ echo "test3.legacy test4.legacy test3 test3.kami" | sed 's/\stest3\s/ /g'
test3.legacy test4.legacy test3.kami

위에서 찾는 것은공간테스트3공간이것을 다음으로 대체합니다.공간.

메모:이것은 test3이 목록의 첫 번째 상황을 처리하지 않습니다!

답변3

이식 가능:

sed -e 's/.*/ & /' -e :1 -e 's/ test3 / /g;t1' -e 's/^ //;s/ $//'

그건:

  • 먼저 줄의 시작과 끝 부분에 공백을 추가하여 test3시작과 끝을 특별히 고려할 필요가 없도록 하고,
  • test3공백으로 둘러싸인 공백을 단일 공백으로 바꾸고 ,
  • (경우를 포함하기 위해) 대체 항목이 있는 한 프로세스를 반복합니다 test3 test3.
  • 처음에 추가한 선행 및 후행 공백을 제거합니다.

답변4

sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt

위에서 시도해보세요

관련 정보