sed 교체를 위한 입력으로 개행 문자가 포함된 파일 사용

sed 교체를 위한 입력으로 개행 문자가 포함된 파일 사용

일부 파일을 다시 포맷하는 스크립트를 작성 중입니다. 기존 콘텐츠를 대체하는 콘텐츠에 줄바꿈이 포함되어 있다는 점을 제외하면 세부정보는 중요하지 않습니다. Sed는 개행 문자를 sed 명령을 종료하는 것으로 해석하고 오류를 반환합니다. 먼저 Windows의 gitbash에서 시도한 다음 CentOS 7에서 시도했습니다. 아래 출력은 입력 파일에 개행 문자가 나타나면 sed 명령이 실패함을 보여줍니다.

$ echo foobar > foobar.txt

$ echo foo | sed "s/foo/$(cat foobar.txt)/"
foobar

$ echo barfoo >> foobar.txt

$ cat foobar.txt
foobar
barfoo

$ echo foo | sed "s/foo/$(cat foobar.txt)/"
sed: -e expression #1, char 12: unterminated `s' command

나는 출력을 원한다.

foobar
barfoo

\n개행 문자를 변환하거나 이스케이프 처리할 수 있는 쉬운 방법(잘 해킹하세요. 프로덕션 환경에서는 작동하지 않음)이 있나요 ?

답변1

escaped_file_contents=$(<foobar.txt sed 's:[\/&]:\\&:g;$!s/$/\\/')
sed "s/foo/$escaped_file_contents/g"

그러나 뒤에 오는 빈 줄( foobar.txt있는 경우)은 제거됩니다.

이것 좀 봐비슷한 질문과 답변더 알아보기.

또는 다음을 사용하여 perl:

REPL=$(cat foobar.txt) perl -pe 's/foo/$ENV{REPL}/g'

또는 perl직접 내용을 읽어보세요.foobar.txt

perl -pe '
  BEGIN {$/ = undef; $repl = <>; $_ = "\n"; chomp $repl}
  s/foo/$repl/g' foobar.txt -

답변2

Gnu sed를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

$ echo foo | sed -e 's/foo/cat foobar.txt/e'

s///e 명령을 사용할 때 sed는 전체 패턴 공간에서 작동합니다. 후행 개행 문자도 잘라야 합니다.

또는 Perl을 사용하십시오.

 $ perl -lpe 's/foo/qx(cat foobar.txt)/e' 

관련 정보