여러 대체 표현식을 사용할 때 sed에 한 번만 대체하도록 어떻게 지시할 수 있나요?

여러 대체 표현식을 사용할 때 sed에 한 번만 대체하도록 어떻게 지시할 수 있나요?

여러 대체 규칙이 있지만 첫 번째 적용 가능한 규칙만 사용하고 싶습니다. 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

관련 정보