4

输入文件

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

输出文件

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

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

IE old name"; # comment "should be updated

使用grep,sedawk!

4

3 回答 3

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"
于 2012-04-18T16:19:40.033 回答
7

赛德:

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

呸:

awk -F'"' '{ print $2 }'
于 2012-04-18T15:27:02.810 回答
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"'"/'
于 2012-04-18T15:38:52.603 回答