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