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)

고쳐 쓰다:

좋은 사람들이 그렇게 우아하게 표현했듯이@stephenchazeras이것은 일부 상황을 해결하지 못합니다. 휴대성 부분도 강조하세요. 바라보다다음 사항에 답해 보세요..

GNU 변형은 다음을 수행합니다.(희망), 예:

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

중복 일치 항목을 처리합니다. 또는 한 사람이 여러 공간 등을 처리할 수도 있습니다. 입력에 따라 다릅니다.

오푸드


대안으로 아마도 (단지 출발점으로):

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

위의 방법을 시도해 보세요.

관련 정보