我想从以下行中grep inside()内容,例如:
name (Jack)
name (Lily)
name (Kobe)
以下awk命令可以完成这项工作,但是我不明白“[()]”是如何工作的,有人可以逐个字符地解释它吗?
awk -F'[()]' '{print $2}' file
如果我想使用grep或sed,那么语法是什么,请详细解释。
答案 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 -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