私のテキストファイルには次のテキストブロックがあります。
* 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 *
stdout
sedのように出力を印刷します。
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