最後のパターン一致の前にファイルの2行にテキストを追加します。

最後のパターン一致の前にファイルの2行にテキストを追加します。

TEXTmyfile.txtテキストが見つかった最後の場所に複数行の文字列を追加する必要があります# My Search

一般的なパターン交換の場合は大丈夫ですsediしかし、.で一致より2行上に移動する方法がわかりませんsed

はいmyfile.txt:

text1
text2
#
# My Search
#
text4
text5
#
# My Search
#
text6

TEXT良い:

TEXT="
[my search]
home=/var/home
string=random

"

myfile.txt終わりを見てください:

text1
text2
#
# My Search
#
text4
text5

[my search]
home=/var/home
string=random

#
# My Search
#
text6

答え1

grep -n行番号を抽出し、それをsedアドレスに使用してテキストを挿入するには、テキストを正しく引用する必要があります。つまり、各改行の前にはバックスラッシュが必要です。

line=$(grep -n '# My Search' myfile.txt | tail -n1 | cut -f1 -d:)
((--line))
text=${TEXT//$'\n'/$'\\\n'}
text=${text%$'\\\n'}$'\n'

sed "$line i \\
$text" myfile.txt

答え2

tac+bash(変数置換) + GNUsed方法:

txt_reversed=$(echo "$TEXT" | tac)
tac myfile.txt \
| sed -e "N;N;N; s~#\n# My Search\n#~&${txt_reversed//$'\n'/\\n}\n~" | tac

出力:

text1
text2
#
# My Search
#
text4
text5

[my search]
home=/var/home
string=random

#
# My Search
#
text6

答え3

これを一度に行う最も簡単な方法は、後ろに検索できるツールを使用することです。edこれがその1つです。理想的には、テキストをファイル(たとえばinsert.txt)に保存し、最後の項目の前にファイルの内容を2行挿入することで、PATTERN以下を実行できます。

ed -s infile <<\IN
.t.
?PATTERN?-2r insert.txt
$d
,p
q
IN

最後の項目を見つけて別の行にPATTERN移動して挿入します。その後、バッファの内容を印刷します。ファイルをその場で編集するには、そのファイルを 。2rinsert.txt,pw


戻ることができない他のツールの場合は、2つの手順を実行することをお勧めします。最初のステップ - 行番号を取得し、2番目のステップ - lineの後NR-2またはlineの前にテキストの内容を挿入しますNR-1。変数に格納されているテキストの場合は、正規表現に依存する他のツールを好みますawk(後者は、特殊文字をエスケープするために挿入するテキストを前処理する必要があります。改行文字だけでなくエスケープする必要がある複数の文字があります。使用された技術):

export TEXT
awk 'NR==FNR{if ($0 ~ /PATTERN/){c=NR};next}
{if (FNR==(c-1)){print ENVIRON["TEXT"]}};1' infile infile

答え4

stackExchangeへの私の最初の貢献です。

最後の一致の前に行を挿入する方法ですsed

sed -e '/PATTERN[^\n]*/,$!b;//{x;//p;g};//!H;$!d;x;iTEXTOINSERT' FILE

sed最初の一致の前に行を挿入する方法です。

sed -i -e '/PATERN/{a\\TEXTOINSERT' -e ':a;n;ba}' FILE

あいさつ!

関連情報