파일에 다음과 같은 텍스트 블록이 있습니다.
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)
업데이트:
그리고 좋은 점을 우아하게 표현한 것처럼@스테판 차젤라스이것은 특정 경우를 처리하지 않습니다. 휴대성 부분도 강조합니다. 보다아래에 답변하세요.
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
위에서 시도해보세요