여러 대체 표현식을 사용하는 동안 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

관련 정보