sed를 사용하여 명령을 라인의 결과로 바꾸기(명령 출력)

sed를 사용하여 명령을 라인의 결과로 바꾸기(명령 출력)

sed를 사용하여 특정 정규식 추출 명령을 해당 출력으로 바꿀 수 있습니까?

예를 들어 다음 파일이 있습니다.

2 + 2 = $$shell:echo 2 + 2 | bc$$ // and "some unescaped text' here

어떻게 변환합니까?

2 + 2 = 4 // and "some unescaped text' here

명령을 추출하여 평가할 수 있다는 것을 알았습니다.

echo '2 + 2 = $$shell:echo 2 + 2 | bc$$ // and "some unescaped text' here | sed -e 's/.*\$\$shell:\(.*\)\$\$.*/\1/e'
4

하지만 나머지 줄을 유지하는 방법을 이해하지 못합니다.

답변1

펄을 사용할 수 있습니다 ...

perl -pe 's[\$\$shell:(.*?)\$\$][ qx($1) =~ s/\n$//r ]ge' < inputfile

( qx후행 줄 바꿈을 제거하지 않으므로 =~ s/\n$//r후행 줄 바꿈이 제거된다는 점을 제외하면 명령 대체와 동일합니다. 주변 내용은 s[][]ge대체에서 Perl 표현식을 사용하는 일반적인 대체일 뿐입니다.)

답변2

못생겼지만

$ echo '2 + 2 = $$shell:echo 2 + 2 | bc$$ // and some text here' | 
  sed -e 's/\(.*\)\$\$shell:\(.*\)\$\$\(.*\)/printf "%s%s%s\n" "\1" "$(sh -c "\2")" "\3"/e'
2 + 2 = 4 // and some text here

관련 정보