대체 규칙이 여러 개 있지만 적용 가능한 첫 번째 규칙만 사용하고 싶습니다. sed
는 기본적으로 나머지 규칙을 사용하여 출력을 계속 처리합니다. 첫 번째 대체 후 어떻게 중단합니까? 그냥 사용해도 되나요 sed
? 설명서에서 옵션을 찾을 수 없습니다.
실제 출력
$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"
three
원하는 작업
$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"
two
답변1
t
대체가 이루어진 경우 각 명령 뒤에 명령을 사용하여 s
스크립트 끝으로 분기합니다.
sed -e 's/something/else/;t' \
-e 's/one/two/;t' \
-e 's/two/three/;t' <<<"one"
여기서 마지막 대체 이후의 명령은 필요하지 않지만 이 코드를 자동으로 생성하면 마지막에도 t
각 접미사를 붙이는 데 문제가 없습니다 .s
답변2
다른 명령에서 분기 't'를 사용하는 sed가 완벽한 답변입니다.
이것은 단지 제안일 뿐입니다. 교체된 경우 내부에서 여러 작업을 수행하려는 경우 다음을 사용할 수 있습니다.앗:
awk ' { if (gsub("something","else",$0) || gsub("one","two",$0) || gsub("two","three",$0) ){ print $0;exit}; }' <<<"one"
답변3
이는 순서대로 평가되므로 원이 없고 쉽게 수행할 수 있는 경우 다음을 사용하면 됩니다.
s/two/three/; s/one/two/; s/something/else/
원이 있거나 목록이 다른 데이터에서 생성된 경우 마커를 사용할 수 있습니다. 예:
s/@/@@/g
s/one/t@wo/
s/two/t@hree/
s/something/e@lse/
s/@\(.\)/\1/g