sed 명령 – sed 's/test/toast/' – 파일 [중복]에서 "test"의 모든 항목을 대체하지 않습니다.

sed 명령 – sed 's/test/toast/' – 파일 [중복]에서 "test"의 모든 항목을 대체하지 않습니다.

두 번째 "테스트" 줄도 교체하면 안 되나요? 모든 "테스트"를 대체하는 명령을 어떻게 작성합니까?

$ sed 's/test/toast/' texttest.txt 
toast file test file hahahaha 1
toast file test file hahahaha 2

답변1

알았어, 알아…

g는 첫 번째 일치 항목뿐만 아니라 정규식의 겹치지 않는 모든 일치 항목을 대체합니다.

$ sed 's/test/toast/g' texttest.txt 
toast file toast file hahahaha 1
toast file toast file hahahaha 2

답변2

이미 발견했듯이 각 줄에서 처음 나타나는 " " s/test/toast/만 " "로 대체됩니다. sed가 겹치지 않는 모든 " "을 " "로 바꾸도록 하려면 다음을 추가해야 합니다.testtoasttesttoast전역 교체 플래그g다음과 같이 교체 명령에:

$ echo 'This test is a test.' | sed 's/test/toast/g'
This toast is a toast.

g플래그는 겹치지 않는 대체만 처리합니다. 예를 들어 " testest"를 " "로 변환하는 toastest것이 아니라 " toastoast"로 변환합니다.

$ echo 'This test is the testest test.' | sed 's/test/toast/g'
This toast is the toastest toast.

만약 너라면하다중복 교체를 원하면 다음과 같이 할 수 있습니다.루프를 사용하여 해결:

$ echo 'This test is the testest test.' | sed ':loop; s/test/toast/; t loop'
This toast is the toastoast toast.

시. ;위에서 언급했듯이 명령 구분 기호로 사용하는 것은 GNU sed의 기능입니다. BSD sed(예: MacOS)의 경우 리터럴 줄 바꿈 또는 여러 인수를 사용해야 합니다 -e.

$ echo 'This test is the testest test.' | sed ':loop
s/test/toast/
t loop'
This toast is the toastoast toast.

$ echo 'This test is the testest test.' | sed $':loop\n s/test/toast/\n t loop'
This toast is the toastoast toast.

$ echo 'This test is the testest test.' | sed -e ':loop' -e 's/test/toast/' -e 't loop'   
This toast is the toastoast toast.

(이 모든 것은 GNU sed에도 적용됩니다. 두 번째 버전 $''특정 껍질의 특성, bash 및 zsh와 같은 sed 코드 자체에서 발생하는 백슬래시를 인용해야 할 수도 있습니다. )

관련 정보