아래 코드는 출력되어야합니다끈
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/
)의 빈 정규 표현식은 가장 최근에 일치된 패턴, 즉 이전 표현식의 패턴을 재사용합니다.