web-dev-qa-db-ja.com

sedを使用してWordを複数行に置き換えますか?

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

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

さて、少しstfwを実行した後、sed -ei "s/_data_/${DATA}/g" mail.tplおよび sed replace with variable with variable lines のようないくつかの項目を見つけました。それらのどれも動作しません。

さて、問題はどのようにsedを取得してテキストを複数行のテキストで置き換えるかです。

sedの代替も大歓迎です!)

30
Cobra_Fast

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

DATA=`echo ${DATA} | tr '\n' "\\n"`
#now, DATA="line1\nline2\nline3"
sed "s/_data_/${DATA}/" mail.tpl
14
ring bearer

変数置換を使用して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
_
13
Kent

試してみましたが、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"

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

11
Albert Veli

次のように、sedをPerlコマンドに置き換えるだけです。

Perl -i.bak -pe 's/_data_/$ENV{"DATA"}/g' mail.tpl 
10
anubhava

持参人の答えは私にはうまくいきませんでした。 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 

共有したいと思っただけです。

9
Yuval

\ですべての改行をエスケープする(最後のものを除く)とうまくいきました。最後の改行は、sコマンドを壊さないようにエスケープしてはなりません。

例:

DATA="a
b
c"

ESCAPED=$(echo "${DATA}" | sed '$!s@$@\\@g')
echo "${ESCAPED}" 
a\
b\
c

sed "s/pattern/${ESCAPED}/" file
1
mgraff

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

$ sed '/_data_/r DATA_FILE' mail.tpl | sed '/_data_/d'> temp; mv temp mail.tpl
1
Mihai

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

Mail.tplにテキストファイルを挿入し、mail.tplからdataを削除します。

echo ${DATA} > temp.txt    
sed -i -e "/_data_/r temp.txt" -e "//d" mail.tpl
1
Ben Pingilley

交換部品に「\ n」を挿入しようとしたかどうかわからない

sed 's/[pattern]/\
[line 1]\n\
[line 2]\n\
[line n]\n\
/g' mail.tpl

読みやすさのため、最初の行には/ \があります。その後の各行は、テキストエディタで見られるようなスタンドアロンの行です。最後の行は、読みやすさの理由から、スタンドアロンです。必要に応じて、このすべてを1行にすることができます。私がテストしたところ、Debian Jessieで動作します。

0
lsu_guy