Example:
This (word1) is a test (word2) file.
我想要的是:
This is a test file.
问题是括号出现多次,所以如果我使用:
sed 's/<.*>//g'
I get This file
这是错误的。
如果我想替换两个相同模式之间的字符串怎么样?
Like:
WORD1 %WORD2% WORD3 => WORD1 WORD3
您所需要的只是一个否定的字符类[^<>]*
它将匹配除 a 之外的任何字符<
or >
:
sed 's/<[^<>]*>//g'
或者,如果您有圆括号,则可以使用[^()]*
(请注意,在 BRE 语法中,要匹配文字(
or )
逃跑\
没有必要):
sed 's/([^()]*)//g'
See IDEONE演示
至于更新,您可以删除所有内容WORD1
till WORD3
using .*
, but 仅当只有一组时WORD1
and WORD3
(demo):
echo "WORD1 %WORD2% WORD3" | sed 's/WORD1.*WORD3/WORD1 WORD3/g'
With sed,不可能使用lookarounds(这里是lookaheads),也不可能使用惰性量词来将匹配限制在最左边WORD3
发生。如果你确定不存在%
之间的符号,您仍然可以使用否定字符类方法(demo):
echo "WORD1 %WORD2% WORD3" | sed 's/%[^%]*%//g'
通用解决方案就是分几个步骤来做:
- 将开始和结束分隔符替换为未使用的字符 (
<UC>
)(我使用的是俄语字母,但它应该是一些控制字符)
- 使用否定字符类
<UC1>[^<UC1><UC2>]*<UC2>
替换为必要的替换字符串
- 恢复初始分隔符。
这是一个example:
#!/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
我正在对一个空间进行硬编码,但可以在必要时进行调整。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)