39

ユーザーに送信する電子メールを準備する必要がある bash スクリプトに取り組んでいます。

いくつかのデータを集約し、最終的に複数行のものになります。に格納されている例については、$DATA.

さて、少しstfwした後、sed replace with variable with multiple lines のsed -ei "s/_data_/${DATA}/g" mail.tplようなものもいくつか見つけました。それらのどれも機能しません。

問題は、sed何かを複数行のテキストに置き換えるにはどうすればよいかということです。

(代用sedも大歓迎です!)

4

9 に答える 9

26

これは、変数置換を使用して AWK で行うことができます。を使用して AWK で変数を設定し、-vAWK のgsub関数を使用して、正規表現のすべての出現箇所をその変数に置き換えることができます。

たとえば、ファイルtestに次の内容がある場合...

foo
bar
blah _data_and_data_
foo
_data_ foobar _data_ again

...そしてBash変数$DATAは...

1
2
3
4
5

... 次に、ファイル内awk -v r=$DATA '{gsub(/_data_/,r)}1' testの正規表現のすべての出現箇所を の内容に置き換えます。結果は次のようになります。_data_test$DATA

foo
bar
blah 1
2
3
4
5and1
2
3
4
5
foo
1
2
3
4
5 foobar 1
2
3
4
5 again
于 2012-04-11T14:11:20.477 に答える
16

次のように、単に sed を perl コマンドに置き換えることをお勧めします。

perl -i.bak -pe 's/_data_/$ENV{"DATA"}/g' mail.tpl 
于 2012-04-11T14:31:49.133 に答える
15

" " を使用して複数行のテキストを作成する場合、次\nのような単純なsedコマンドで機能します。

DATA=`echo ${DATA} | tr '\n' "\\n"`
#now, DATA="line1\nline2\nline3"
sed "s/_data_/${DATA}/" mail.tpl
于 2012-04-11T14:13:15.423 に答える
11

試してみましたsed 's/pattern/\na\nb\nc/g'が、すべてのシステムで機能するとは限りません。機能するのは\、次のように、置換パターンに改行が続くことです。

sed 's/pattern/a\
b\
c/g'

これは、パターンが見られる場合bを含む行と含む行を追加します。c

変数に入れるには、2 つのバックスラッシュを使用します。

export DATA="\\
a\\
b\\
c"

その後:

sed "s/pattern/${DATA}/g"

二重引用符に注意してください。

于 2012-04-11T14:14:20.107 に答える
8

変数を一時テキスト ファイルにエコーします。

mail.tpl にテキスト ファイルを挿入し、mail.tplからデータを削除する

echo ${DATA} > temp.txt    
sed -i -e "/_data_/r temp.txt" -e "//d" mail.tpl
于 2015-10-28T17:52:43.870 に答える
2

データを一時ファイルに入れて実行できます。

$ sed '/_data_/r DATA_FILE' mail.tpl | sed '/_data_/d'> temp; mv temp mail.tpl
于 2012-04-11T14:19:40.347 に答える