스크립트가 있습니다~/bin/script
$ cat ~/bin/script
#!/bin/bash
perl -pe 's/loremipsum/`cat ~/foo/bar/file.txt`/ge' -i ~/path/to/target.txt
스크립트는 loremipsum
in의 각 인스턴스를 의 콘텐츠로 바꿔야 합니다. 그러나 반품 발행target.txt
file.txt
script
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