如何在bash中有条件地排除正则表达式中的模式?

时间:2014-03-18 22:32:23

标签: regex bash grep

这是input.txt的内容:

hello=123
1234
stack=(23(4))
12341234
overflow=345
=
friends=(987)

然后我试图将所有线条相等地移除外部的肠衣(如果线条有的话)。

要清楚,这是我正在寻找的结果

hello=123
stack=23(4)
overflow=345
friends=987

我坚持这样的事情:

cat input.txt | grep -Poh '.+=(?=\()?.+(?=\))?'

但不会什么都不返回。我究竟做错了什么?你有任何想法吗?我很感兴趣。

2 个答案:

答案 0 :(得分:1)

使用awk:

awk 'BEGIN{FS=OFS="="} NF==2 && $1!=""{gsub(/^\(|\)$/, "", $2); print}' file
hello=123
stack=23(4)
overflow=345
friends=987

答案 1 :(得分:1)

以下是sed的另一种方式:

sed -nr '              # Use n to disable default printing and r for extended regex 
/.+=.+/ {              # Look for lines with key value pairs separated by =
    /[(]/!ba;          # If the line does not contain a paren branch out to label a
    s/\(([^)]+)\)/\1/; # If the line contains a paren find a subset and print that
    :a                 # Our label 
    p                  # print the line
}' file

$ sed -nr '/.+=.+/{/[(]/!ba;s/\(([^)]+)\)/\1/;:a;p}' file
hello=123
stack=23(4)
overflow=345
friends=987