두 번째 "테스트" 줄도 교체하면 안 되나요? 모든 "테스트"를 대체하는 명령을 어떻게 작성합니까?
$ 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가 겹치지 않는 모든 " "을 " "로 바꾸도록 하려면 다음을 추가해야 합니다.test
toast
test
toast
전역 교체 플래그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 코드 자체에서 발생하는 백슬래시를 인용해야 할 수도 있습니다. )