我正在尝试为ex替换以下字符串: 来自
['55',2,1,10,30,23],
到
['55',2,555,10,30,23],
OR
['55',2,1,10,30,23],
到
['55',2,1,10,9999,23],
我四处寻找并发现:
$ echo "[55,2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if($1=="[55"){$2=10}{print}}'
[55,10,1,10,30,23],
但它不适用于我的情况,因为有" ' "在我的if条件中,价值为1美元左右:
$ echo "['55',2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if($1=="['55'"){$2=10}{print}}'
['55',2,1,10,30,23],
答案 0 :(得分:1)
问题不在awk代码中,而是shell扩展。您不能在单引号的shell字符串中使用单引号。当您尝试将输入字符串放入单引号时遇到同样的问题:
$ echo '['55',2,1,10,30,23],'
[55,2,1,10,30,23],
- 单引号消失了!这是有道理的,因为他们完成了引用[
和,2,1,10,30,23],
(此处55
未加引号)的工作,但这不是我们想要的。
解决方案是单独引用它们之间的部分并手动挤压它们:
$ echo '['\''55'\'',2,1,10,30,23],'
['55',2,1,10,30,23],
或者,在这种特殊情况下,单引号所在的位置之间没有任何恶意,
echo '['\'55\'',2,1,10,30,23],' # the 55 is now unquoted.
应用于您的awk代码,如下所示:
$ echo "['55',2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if($1=="['\'55\''"){$2=10}{print}}'
['55',10,1,10,30,23],
或者,如果您的代码中有许多单引号,这看起来不太好,您可以将awk代码写入文件,例如foo.awk
,然后使用
echo "['55',2,1,10,30,23]," | awk -F, -f foo.awk
然后你不必担心shell引用awk代码中的意外事件,因为awk代码不再受shell扩展的影响。
答案 1 :(得分:0)
我认为如何匹配和替换对你来说不是问题。您面临的问题是,如何在字段中匹配单个引用'
。
为避免逃避代码中的每个'
,并使代码更具可读性,您可以将引用赋予变量,并在代码中使用该变量,例如:
echo "['55' 1
['56' 1"|awk -v q="'" '$1=="["q"55"q{$2++}7'
['55' 2
['56' 1
在上面的示例中,仅与['55'
一致,第二个字段增加了。