シェルで複数行を置き換える

シェルで複数行を置き換える

私のテキストファイルには次のテキストブロックがあります。

* 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

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

これを行うのに最適なシェル構造は何ですか? 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

関連情報