我有一个删除所有括号的表达式,但我想离开"(2017)"完整。我使用sed进行更改。
表达式:
(\([^)]+\))
示例数据:
(abc2678) aaaa (2017) aaaa (def0719)
(abc2678) aaaa
(abc2678) aaaa (2017) aaaa (def0719)(def0719)
(abc2678) aaaa aaaa (def0719)(def0719)
答案 0 :(得分:1)
您不能为此使用sed
,它不支持环视。
使用perl
:
perl -pe -i 's/\((?!2017\))[^()]*\)//g' file
请参见proof
EXPLANATION
EXPLANATION
--------------------------------------------------------------------------------
\( '('
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
2017 '2017'
--------------------------------------------------------------------------------
\) ')'
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
[^()]* any character except: '(', ')' (0 or more
times (matching the most amount possible))
--------------------------------------------------------------------------------
\) ')'
答案 1 :(得分:0)
请尝试以下操作并告诉我这是否对您有所帮助。
awk '{for(i=1;i<=NF;i++){if($i !~ /\(2017\)/){sub(/\(.*\)/,"",$i)}}} 1' Input_file
输出如下。
aaaa (2017) aaaa
aaaa
aaaa (2017) aaaa
aaaa aaaa
以上将删除(至)(2017)之间的所有内容。如果您只想删除(和)(2017),那么以下内容可能对您有所帮助。
awk '{for(i=1;i<=NF;i++){if($i !~ /\(2017\)/){gsub(/\(|\)/,"",$i)}}} 1' Input_file
输出如下。
abc2678 aaaa (2017) aaaa def0719
abc2678 aaaa
abc2678 aaaa (2017) aaaa def0719def0719
abc2678 aaaa aaaa def0719def0719