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

関連情報