正则表达式删除除一个匹配之外的所有括号

时间:2017-10-14 02:49:48

标签: regex sed

我有一个删除所有括号的表达式,但我想离开"(2017)"完整。我使用sed进行更改。

表达式:

(\([^)]+\))

示例数据:

(abc2678) aaaa (2017) aaaa (def0719)
(abc2678) aaaa
(abc2678) aaaa (2017) aaaa (def0719)(def0719)
(abc2678) aaaa aaaa (def0719)(def0719)

2 个答案:

答案 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