他の部分文字列が存在しない場合にのみ、部分文字列を検索して置き換えます。

他の部分文字列が存在しない場合にのみ、部分文字列を検索して置き換えます。

非常に大きな文書には次の文字列があります。

1.test.html#
2.test.md#
3.http://test.html#
4.https://test.md#
5.http://test.md#
6.test2.md#

今、文字列に何もない.md#場合にのみ、それぞれを次のように置き換えたいと思います。したがって、2と6のみを交換する必要があります。シェルスクリプトでこれをどのように実行できますか?.html#http

答え1

GNU sedを使用してください。現在の行(パターンスペース)にhttpスクリプトの終わり()が含まれている場合は、スクリプトの最後に移動しますb。それ以外の場合は検索して置き換えてください。

sed '/http/b; s/\.md#/.html#/' file

出力:

1.テスト.html#
2.テスト.html#
3.http://test.html#
4.https://test.md#
5.http://test.md#
6.テスト2.html#

ファイルを「所定の位置に」編集するには、sedのoptionsを使用します-i


望むより:man sed

答え2

perl -pe'/http/ or s/\.md#/.html#/' input.txt > output.txt
perl -pe'/http/||s/\.md#/.html#/' input.txt > output.txt   #same
perl -i -pe'/http/||s/\.md#/.html#/' file.txt              #edit inplace, changes file.txt
perl -i.bk -pe'/http/||s/\.md#/.html#/' files*.txt         #same with backups to .bk files

sed彼らはawk素晴らしいですが、perl彼らが持っているすべてとそれ以上のものを持っています。

関連情報