テキスト ファイルには次のテキスト チャンクがあります。
* 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 *
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