スクリプトがあります~/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