ユーザーに送信するメールを準備する必要があるbashスクリプトに取り組んでいます。
これはいくつかのデータを集約し、最終的には複数行になります。 $DATA
に格納されている例について。
さて、少しstfwを実行した後、sed -ei "s/_data_/${DATA}/g" mail.tpl
および sed replace with variable with variable lines のようないくつかの項目を見つけました。それらのどれも動作しません。
さて、問題はどのようにsed
を取得してテキストを複数行のテキストで置き換えるかです。
(sed
の代替も大歓迎です!)
「\n
」を使用して複数行のテキストを作成する場合、これは単純なsed
コマンドで次のように機能します。
DATA=`echo ${DATA} | tr '\n' "\\n"`
#now, DATA="line1\nline2\nline3"
sed "s/_data_/${DATA}/" mail.tpl
変数置換を使用してAWKでこれを行うことができます。 _-v
_を使用してAWKに変数を設定し、AWKの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
は、ファイルtest
内のすべての正規表現__data_
_を_$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
_
試してみましたが、sed 's/pattern/\na\nb\nc/g'
はすべてのシステムで動作するわけではありません。次のように、置換パターンに\
とそれに続く改行を配置することで機能します。
sed 's/pattern/a\
b\
c/g'
これにより、パターンが表示されたときに、b
を含む行とc
を含む行が追加されます。
変数に入れるには、二重の円記号を使用します。
export DATA="\\
a\\
b\\
c"
その後:
sed "s/pattern/${DATA}/g"
二重引用符に注意してください。
次のように、sedをPerlコマンドに置き換えるだけです。
Perl -i.bak -pe 's/_data_/$ENV{"DATA"}/g' mail.tpl
持参人の答えは私にはうまくいきませんでした。 tr
の使い方は間違っていると思います。書き方もecho
を使用して改行を削除するだけです。
代わりに、sed
を使用しました。改行を置き換えるために 別の回答 のコードを使用しました(クレジット:Zsolt Botykai)。ドル記号も期待していました($
)私の入力では、それで私もそれを処理しました。他の入力処理を追加する必要があるかもしれません。改行を保持するためにecho
で二重引用符を使用していることに注意してください。
DATA="$(cat whatever)"
ESCAPED_DATA="$(echo "${DATA}" | sed ':a;N;$!ba;s/\n/\\n/g' | sed 's/\$/\\$/g')"
次に、${ESCAPED_DATA}
in sed
:
cat input | sed 's/one liner/'"${ESCAPED_DATA}"'/' > output
共有したいと思っただけです。
\
ですべての改行をエスケープする(最後のものを除く)とうまくいきました。最後の改行は、s
コマンドを壊さないようにエスケープしてはなりません。
例:
DATA="a
b
c"
ESCAPED=$(echo "${DATA}" | sed '$!s@$@\\@g')
echo "${ESCAPED}"
a\
b\
c
sed "s/pattern/${ESCAPED}/" file
データを一時ファイルに入れて実行できます。
$ sed '/_data_/r DATA_FILE' mail.tpl | sed '/_data_/d'> temp; mv temp mail.tpl
変数を一時テキストファイルにエコーします。
Mail.tplにテキストファイルを挿入し、mail.tplからdataを削除します。
echo ${DATA} > temp.txt
sed -i -e "/_data_/r temp.txt" -e "//d" mail.tpl
交換部品に「\ n」を挿入しようとしたかどうかわからない
sed 's/[pattern]/\
[line 1]\n\
[line 2]\n\
[line n]\n\
/g' mail.tpl
読みやすさのため、最初の行には/ \があります。その後の各行は、テキストエディタで見られるようなスタンドアロンの行です。最後の行は、読みやすさの理由から、スタンドアロンです。必要に応じて、このすべてを1行にすることができます。私がテストしたところ、Debian Jessieで動作します。