我有一个文件的 grep 输出,如下所示:
"name" "Andrew Spokes"
我想通过管道传输 grep 的输出来提取名称sed
。
我的预期输出是:
Andrew Spokes
我要求也删除引号之间的所有空白。
答案1
一种方法是:
... |sed -r 's/^"[^"]*" *"([^"]*)"$/\1/'
Andrew Spokes
另一个:
sed -r 's/(([^"]*"){3})//; s/"//'
或者:
sed -r 's/.*"(.*)"$/\1/'
这[^"]
会匹配任何不是 的单个字符"
。
答案2
以下表达式适用于 GNU sed:
sed -E 's/^"name"[[:space:]]*"([^"]+)"$/\1/'
这是通过创建一个匹配整行的正则表达式以及匹配找到所需名称部分的子表达式来实现的。这是括号中的部分,它是不是双引号的字符序列。整个匹配的正则表达式被子表达式替换,\1
在表达式末尾引用。
作为其工作原理的示例:
$ # Generate lines in the expected format
$ echo $'"name" "Andrew Spokes"\n"name" "ABC"\n"name" "Foo Bar Baz"'
"name" "Andrew Spokes"
"name" "ABC"
"name" "Foo Bar Baz"
$ # Pipe the same lines to the sed command
$ echo $'"name" "Andrew Spokes"\n"name" "ABC"\n"name" "Foo Bar Baz"' | sed -E 's/^"name"[[:space:]]*"([^"]+)"$/\1/'
Andrew Spokes
ABC
Foo Bar Baz
如果您对 GNU 正则表达式的经验有限,那么在以下位置查找上述正则表达式中使用的结构可能会有所帮助:GNU sed 手册。如果使用不同风格的 sed,细节可能会略有不同。一个标注是-E
选项,这将启用“扩展”正则表达式。在 GNU sed 中,它具有特殊字符,如括号和反斜杠,具有创建子表达式和反向引用而不转义它们的含义。另一个是使用^
和$
要求完整的正则表达式在行的开头和结尾进行匹配。
另一个标注只是使用的 sed 表达式假设所有输入行的均匀程度。如果输入有更多变化,则需要进行调整。