在unix中的特定事件的引号之间提取字符串

时间:2012-04-18 15:22:37

标签: regex unix sed awk grep

输入文件

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

输出文件

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

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

old name"; # comment "should be updated

使用grepsedawk完成该任务的任何想法!

3 个答案:

答案 0 :(得分:8)

目前还不清楚你到底要做什么。首先,你的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"

答案 1 :(得分:6)

桑达:

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

awk中:

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

答案 2 :(得分:1)

我认为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"'"/'