在文件中多次替换单词之间的字符串

时间:2018-09-07 00:46:48

标签: linux awk sed

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

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

有人可以帮我吗?

我查看了其他堆栈溢出调查表,但他们讨论了仅替换模式实例的情况。

3 个答案:

答案 0 :(得分:1)

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

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

应该可以解决问题。 ?将先前的*的含义从“只要模式其余部分匹配的次数尽可能多地匹配”更改为“尽可能多地匹配其余模式的次数”。模式匹配”。

答案 1 :(得分:1)

$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/word1/{/g; s/word2/}/g; s/{[^{}]*}/word1/g; s/}/word2/g; s/{/word1/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
word1 I want this text----word1 I need this also

这很长,看起来很复杂,但是它是一种使用频率很高的技术,实际上只是将word1转换为{word2转换为{{1 }},因此您要在实际替换}中处理字符而不是字符串,因此可以使用否定的括号表达式来避免贪婪的正则表达式占用过多行。

有关https://stackoverflow.com/a/35708616/1745001的更多信息,请参见https://www.w3schools.com/bootstrap/bootstrap_get_started.asp,该方法用于在实际工作开始之前将字符串转换为输入中无法出现的字符,然后再将其还原。

>

答案 2 :(得分:0)

如果一行上只有两个word1-word2模式的实例,这应该可以工作:

sed 's/\(word1\).*word2\(.*\)\(word1\).*word2\(.*\)/\1\2\3\4/' 1.txt

我抓住要保留在转义括号\(和\)中的部分,然后将这些部分称为\ 1 \ 2,依此类推。