仅当另一个子字符串不存在时才搜索并替换子字符串

仅当另一个子字符串不存在时才搜索并替换子字符串

我在一个非常大的文档中有以下字符串:

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

现在我想将每个替换.md#为但仅当字符串中.html#没有时。http所以只有 2 和 6 应该有替换。我怎样才能在 shell 脚本中做到这一点?

答案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.test2.html#

如果您想“就地”编辑文件,请使用 sed 的选项-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拥有他们所拥有的一切,甚至更多。

相关内容