我有一个脚本~/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
但我认为最好仅使用 perl 脚本将字符串替换为文件的内容,因为 foo/bar/file.txt 的内容可能会损坏您的命令。
答案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