Sed 명령 문제

Sed 명령 문제

아래 코드는 출력되어야합니다

LANG=C ; 
echo 'aString12 theString34 otherString56' | \
sed "s;aString12 \(theString34\) anotherString56;$(printf '%s' "\1" | sed 's;[0-9]\{2\}$;;');"

...하지만 출력됩니다문자열 34. 이것34제거되어야 한다| sed;[0-9]{2}$;;');그러나 그것은 진실이 아니다.

이 문제는 해당 부분만 변경하여 해결 해야 하며 $(printf '%s' "\1" | sed 's;[0-9]\{2\}$;;')코드의 해당 부분을 변수로 대체하여 해결해서는 안 됩니다.

미리 감사드립니다.

답변1

sed문제는 명령이 시작되기 전에도 포함된 명령 대체가 수행된다는 것입니다. 쉘이 호출할 매개변수를 알아낼 때 실행됩니다 sed.

sed내부에서 외부 유틸리티를 호출하는 대신 사용해야 하는 문자열 부분을 분리하고 두 번째 바꾸기 명령을 사용하여 수정할 수 있습니다.

echo 'aString12 theString34 otherString56' |
sed -e 's/aString12 \(theString34\) otherString56/\1/' \
    -e 's/[0-9]\{2\}$//'

이렇게 하면 전체 줄이 첫 번째 표현식에서 캡처된 부분으로 대체되고 두 번째 대체가 버퍼의 나머지 부분에 적용됩니다.

!b첫 번째 대체가 어떤 작업을 수행할 때 두 번째 대체만 적용하려면 먼저 표현식을 일치시키고 일치하지 않는 경우 스크립트 끝으로 분기할 수 있습니다( 사용 ). 그 경우했다일치시키려면 두 가지 대체를 적용합니다.

echo 'aString12 theString34 otherString56' |
sed -e '/aString12 \(theString34\) otherString56/!b' \
    -e 's//\1/' \
    -e 's/[0-9]\{2\}$//'

첫 번째 교체( s//\1/)의 빈 정규 표현식은 가장 최근에 일치된 패턴, 즉 이전 표현식의 패턴을 재사용합니다.

관련 정보