首页 > 解决方案 > 在文件中多次替换单词之间的字符串

问题描述

我正在尝试使用以下命令替换文件中两个字符串之间的字符串。文件中可能有任意数量的此类模式。这只是一个例子。

sed 's/word1.*word2/word1/' 1.txt 

在我正在测试的示例源文件中,有两个例子是“word1”后跟“word2”。1.txt文件的内容

word1---sjdkkdkjdk---word2 I want this text----word1---jhfnkfnsjkdnf----word2 I need this also

结果如下。

word1 I need this also

预期输出:

 word1 I want this text----word1 I need this also

有人可以帮我吗?

我查看了其他堆栈溢出问卷,但他们讨论了仅替换该模式的一个实例。

标签: linuxawksed

解决方案


正则表达式是贪婪的——它们匹配尽可能长的字符串,所以从第一个 'word1' 到最后一个 'word2' 的所有内容。不确定是否有任何版本的 sed 支持非贪婪的正则表达式......不过,您可以只使用 perl,它可以:

perl -pe 's/word1.*?word2/word1/g' 1.txt

应该做的伎俩。这?将先验的含义*从“只要模式的其余部分匹配就尽可能多地匹配”变为“只要模式的其余部分匹配就尽可能少地匹配”。


推荐阅读