내 파일에 다음 텍스트 블록이 있습니다.
test3.legacy test4.legacy test3 test3.kami
test3
그냥 전체적으로 검색해서 무엇이든 교체하고 싶습니다 . 안타깝게도 모든 시도가 삭제되었습니다.테스트 3에서 test3.legacy
및 test3.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
위의 방법을 시도해 보세요.