提取unix中特定出现的引号之间的string

input文件

.. set name "old name"; # comment "should be updated" .. 

输出文件

 .. set name "new name" ; #comment "should be updated" .. 

当我试图用grep -i 'name' inputfile | grep -P \".+{\"}引用之间的内容 grep -i 'name' inputfile | grep -P \".+{\"}它的grep -i 'name' inputfile | grep -P \".+{\"}内容在第一个“和最后一个”

old name"; # comment "should be updated

任何想法来完成使用grepsedawk

目前还不清楚你想要做什么。 首先,你的grep命令包含一个大括号,输入不包含。 另外,看起来您要根据您的输入和输出的比较来进行替换。

但是,从字面上理解你的问题,下面是如何grep引号之间的字符串。 你可以使用非贪婪匹配:

 grep -Po '".*?"' 

例:

 $ echo 'set name "username"; # comment "should be updated"' | grep -Po '".*?"' "username" "should be updated" 

编辑:

为了替换一个值,你可以使用sed 。 你不会使用grep

 sed 's/"[^"]*"/"new name"/' 

例:

 $ echo 'set name "old name"; # comment "should be updated"' | sed 's/"[^"]*"/"new name"/' set name "new name"; # comment "should be updated" 

桑达:

 sed 's/[^"]*"\([^"]*\)".*/\1/' 

AWK:

 awk -F'"' '{ print $2 }' 

我假设之后的单词should be是新的用户名

 sed 's/^\([^"]\+"\)[^"]\+\(.*should be \)\([^"]\+\)/\1\3\2\3/' 

用GNU sed稍微整理一下

 sed -r 's/^([^"]+")[^"]+(.*should be )([^"]+)/\1\3\2\3/' 

编辑 – 丹尼斯有一个很好的答案。 如果新名字保存在shell变量中,则可以使用引用技巧:

 new_name="Fred" sed 's/"[^"]*/"'"$new_name"'"/'