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

但我认为最好仅使用 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

相关内容