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