bin에 파일을 삽입하는 Perl 스크립트

bin에 파일을 삽입하는 Perl 스크립트

스크립트가 있습니다~/bin/script

$ cat ~/bin/script
#!/bin/bash

perl -pe 's/loremipsum/`cat ~/foo/bar/file.txt`/ge' -i ~/path/to/target.txt

스크립트는 loremipsumin의 각 인스턴스를 의 콘텐츠로 바꿔야 합니다. 그러나 반품 발행target.txtfile.txtscript

Backticks found where operator expected at -e line 1, at end of line
    (Missing semicolon on previous line?)
Can't find string terminator "`" anywhere before EOF at -e line 1.

내 스크립트에 문제가 있나요?

답변1

백틱 결과를 스크립트 변수에 저장하고 이를 Perl 호출에 사용해야 합니다.

REPL = `cat ~/foo/bar/file.txt`
perl -pe "s/loremipsum/$REPL/ge" -i ~/path/to/target.txt

그러나 foo/bar/file.txt의 내용이 명령을 손상시킬 수 있으므로 Perl 스크립트를 사용하여 문자열을 파일의 내용으로 바꾸는 것이 더 낫다고 생각합니다.

답변2

이 시도:

#!/bin/bash

perl -pe "s/loremipsum/`cat ~/foo/bar/file.txt`/ge" -i ~/path/to/target.txt

작은따옴표에 문제가 있는 것 같습니다.

답변3

~이 문제는 경로를 홈 디렉터리로 바꾸면 해결될 수 있습니다.

또는 다음을 사용할 수 있습니다.

perl -pe '$thing=`cat "$ENV{HOME}/file.txt"`;s/loremipsum/$thing/g' target.txt

아니면 다른 것,더 나은, 생성자는 먼저 파일의 내용을 읽은 다음 문자열을 해당 값으로 바꿉니다.


sed선택할 수 있는 또 다른 도구이며, 다른 파일을 읽는 특별한 명령도 있습니다.

sed '/loremipsum/{
         r file.txt
         d
     }' target.txt

이는 다음을 대체합니다.철사loremipsum내용이 있는 텍스트를 포함합니다 file.txt.

이 문서를 보면 target.txt,

some text
some text loremipsum
some more text

및 파일 file.txt,

This text
is inserted

이 명령은 생성됩니다

some text
This text
is inserted
some more text

관련 정보