一致するパターンのn行目を置き換えます。

一致するパターンのn行目を置き換えます。

次のテキストファイルがあります。

banana
apple
juice
mango
something

パターンを検索していますが、一致juiceするパターンの2行目(つまり、一致するパターンの上の2行)を逆の順序で検索して置き換えようとしていますcoconut

予想出力:

coconut
apple
juice
mango
something

私は次のことを試しましたが、上記の2行だけが削除され、私が探していた行は削除されませんでした。

tac foo.txt |sed '/juice/I,+2 d' |tac
mango
something

上記のスクリプトを適用すると、作業が可能だと思いますが、わかりません。

注:一致は繰り返されず、正確に一致する必要はありません。つまり、一致は長い行でも見つけることができます。一致は大文字と小文字を区別する必要があります。

ベストアンサー1

可能であれば、edストリームではなくファイルを編集し、次のいずれかを編集する必要があります  juice

$ more <<-EOF | ed -s ./tmp.txt
	/juice/
	-2
	c
	coconut
	.
	w
	q
EOF
$

その行を見つけて2行に移動し、change、 write、  quitを実行します。


コメントで@d-ben-knobleが提案したよりコンパクトなバリエーションは次のとおりです。

$ printf '%s\n' '/^juice$/-2s/.*/coconut/' w q | ed -s ./tmp.txt

おすすめ記事