TEXT
myfile.txt
テキストが見つかった最後の場所に複数行の文字列を追加する必要があります# My Search
。
一般的なパターン交換の場合は大丈夫ですsed
。i
しかし、.で一致より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
移動して挿入します。その後、バッファの内容を印刷します。ファイルをその場で編集するには、そのファイルを 。2
r
insert.txt
,p
w
戻ることができない他のツールの場合は、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
あいさつ!