输入文件
..
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
使用grep
,sed
或awk
完成该任务的任何想法!
答案 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"'"/'