括号内的grep内容

时间:2016-04-08 23:42:26

标签: linux shell awk

我想从以下行中grep inside()内容,例如:

name (Jack)
name (Lily)
name (Kobe)

以下awk命令可以完成这项工作,但是我不明白“[()]”是如何工作的,有人可以逐个字符地解释它吗?

awk -F'[()]' '{print $2}' file

如果我想使用grep或sed,那么语法是什么,请详细解释。

4 个答案:

答案 0 :(得分:2)

使用grep,您可以使用非捕获组(需要-P选项)并仅报告匹配(-o选项)

$ echo "name (Jack)" | grep -oP "(?<=\().*(?=\))"

Jack    

与sed类似

$ echo "name (Jack)" | sed -r 's/.*\((.*)\).*/\1/'

Jack

答案 1 :(得分:0)

Grep不能仅返回匹配的字符串,这就是awk的用途。那说......

grep "\((.*)\)" filename

sed "s|\((.*)\)|REPLACEMENT|" filename

答案 2 :(得分:0)

在处理以可预测方式格式化的文件时,awk很好用。 默认情况下,awk使用单个空格作为字段分隔符解析输入文件,并按照它们出现的顺序设置变量$ 1,$ 2。

   awk -F'[()]' '{print $2}' file

上述解决方案有效,因为awk逐行解析文件并识别文件中的两个参数,即$ 1 = name,$ 2 =(value)。 其次,-F作为字段分隔符并采用正则表达式。

我在学习过程中发现这两个链接很有用:

答案 3 :(得分:0)

我尝试了建议的解决方案,每行使用多个内容条目:

echo "first name (Jack) , seconde name (Lily)" | awk -F'[()]' '{print $2}'
#Jack

echo "first name (Jack) , seconde name (Lily)" | grep -oP "(?<=\().*(?=\))"
#Jack) , seconde name (Lily

echo "first name (Jack) , seconde name (Lily)" | sed -r 's/.*\((.*)\).*/\1/'
#Lily

为此,我提供了更强大的解决方案:

解决方案:

echo "name (Jack)"| sed -n 's/[^(|^)]*(\([^(|^)]*\))/\1\n/gp'
#Jack

甚至更简单:

echo "name (Jack)"| sed -n 's/[^(]*(\([^)]*\))/\1 /gp'
#Jack

每行多个条目的测试:

echo "first name (Jack) , seconde name (Lily)" |  sed -n 's/[^(]*(\([^)]*\))/\1 /gp'
#Jack Lily

echo "first name (Jack) , seconde name (Lily)" | sed -n 's/[^(]*(\([^)]*\))/\1\n/gp'
#Jack
#Lily