我在用着
grep 'name=>' log.txt | cut -d\ -f3
我得到这样的结果:
name=>"Faya-Largeau",
name=>"Paris",
name=>"Madrid",
name 是变量的输出(我有一长串像这样的城市)
我只想得到“Faya-Largeau”或“巴黎”或“马德里”,所以我需要排除括号之间的城市之前和之后的 name=> 和 。
我怎样才能做到这一点 ?
提前致谢
答案1
该实用程序的主要用途grep
是提取与特定正则表达式匹配的行。的一些非标准实现grep
也可以从行中提取子字符串,但这侵犯了编辑器的领域sed
,通常用于对文件或文本流中的行执行脚本编辑。
使用标准sed
首先删除所有不包含子字符串name=>
后跟双引号字符串的行并捕获双引号字符串。然后用双引号字符串替换匹配的行。
sed -e '/.*name=>\("[^"]*"\).*/!d' -e 's//\1/' log.txt
(这应该直接在您的原始文件上运行。)
第一个表达式/.*name=>\("[^"]*"\).*/!d
删除所有与给定正则表达式不匹配的行。它还捕获 中的双引号字符串\1
。
第二个表达式 ,s//\1/
在其余行上用捕获的双引号字符串替换与前一个正则表达式匹配的行的位。
答案2
你可以试试这个:
$ grep 'name=>' log.txt | cut -d'"' -f2
|
将 的输出通过管道传输grep
到 的输入cut
。
cut -d'"' -f2
剪切由字符分隔的字段中的每一行输入"
并提取第二个字段。
如果您想将"
角色保留在城市名称周围,这可能行不通。
答案3
使用awk
代替grep
和cut
。例如:
awk -F'"' '/name=>/ {print $2}'
答案4
就这而言,这只是双引号之间内容的捕获:
输入
$ cat file
name=>"Brie Comte Robert",
name=>"Montcuq",
name=>"Faya-Largeau",
name=>"Paris",
name=>"Madrid",
只要grep
$ grep -oE '"[^"]+"' file
$ grep -o '"[^"]\+"' file
使用GNU
awk
:
$ awk 'BEGIN{FPAT="\042([^\"]+)\042"} {print $1}' file
输出
"Brie Comte Robert"
"Montcuq"
"Faya-Largeau"
"Paris"
"Madrid"