シェルでの複数行の置換

シェルでの複数行の置換

テキスト ファイルには次のテキスト チャンクがあります。

* Exported from Foo *

Title and Section

そしてもう一つ

* Exported from Foo *

Other Title and Other Section

これを置き換える必要があります

# Title and Section

そして

# Other Title and Other Section

今、私はこれを次のように実行できます:

echo "$(grep -A 2 "Exported from Foo" ../tmp/data/${nospacefile} | grep -v "Exported from Foo" | grep -v -- -- | tr -d '\r' | grep -v -e '^[[:space:]]*$' | sed -e 's/^[ \t]*//')" | while read -r title; do sed -i -e "s/^\([[:blank:]]*\)$title/\# $title/g" ../tmp/data/${nospacefile}; done

ただし、「タイトルとセクション」または「その他のタイトルとその他のセクション」という文字列は、置き換えたくない場所にも表示されます。エクスポートされた行と空白行の後に表示される場合にのみ置き換えたいです。

これを実行するために利用できる最適なシェル構成は何ですか? stdout を perl、python などに送ることができて大変満足です。

答え1

試すことができます。これにより、2 行目が空かどうかに関係なく、ed(1)3 行目が編集されます。* Exported from Foo *

stdoutsedのように出力を印刷するだけ

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' ,p Q | ed -s file.txt 

これは、出力を に印刷してstdout、ファイルをその場で編集するだけです。

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' w | ed -s file.txt 

ed出力を印刷するだけのスクリプトを使用するにはstdout

cat script.ed

出力

g/^\* Exported from Foo \*$/+2s/^/# /
,p
Q

ファイルを編集するスクリプトin-place

g/^\* Exported from Foo \*$/+2s/^/# /
w
q

今ならできる

ed -s file.txt < script.ed

関連情報