例子:
This (word1) is a test (word2) file.
我想要的:
This is a test file.
问题在于括号出现了多次,因此如果我使用:
sed 's/<.*>//g'
我可以得到一个错误的This file
文件。
如果我想要替换两个相同模式之间的字符串怎么办?
例如:
WORD1 %WORD2% WORD3 => WORD1 WORD3
[^<>]*
,它将匹配除<
或>
之外的任何字符。sed 's/<[^<>]*>//g'
或者,如果你有圆括号,可以使用[^()]*
(请注意,在BRE语法中,为了匹配文字(
或)
,不需要转义字符\
):
sed 's/([^()]*)//g'
请看IDEONE演示
至于更新,您可以使用.*
从WORD1
到WORD3
删除所有内容,但前提是只有一组WORD1
和WORD3
(演示):
echo "WORD1 %WORD2% WORD3" | sed 's/WORD1.*WORD3/WORD1 WORD3/g'
使用sed,无法使用前瞻(lookaheads)或懒惰量词来限制匹配到最左边的WORD3
出现次数。如果你确定中间没有%
符号,仍然可以使用否定字符类方法(演示):
echo "WORD1 %WORD2% WORD3" | sed 's/%[^%]*%//g'
一种通用解决方案是分几个步骤完成:
<UC>
)替换起始和结束定界符(我使用俄语字母,但应该是某些控制字符)<UC1>[^<UC1><UC2>]*<UC2>
用所需的替换字符串进行替换 这里有一个示例:
#!/bin/bash
echo "WORD1 %WORD2% WORD3 some text WORD1 %WORD2% WORD3" |
sed 's/WORD1/й/g' |
sed 's/WORD3/ч/g' |
sed 's/й[^йч]*ч/й ч/g' |
sed 's/й/WORD1/g' |
sed 's/ч/WORD3/g'
// => WORD1 WORD3 some text WORD1 WORD3
\+
可以使用,所以它不是纯BRE。这里可能有另一个重复的。 - Wiktor Stribiżew