带有 If 条件的 AWK
AWK with If condition
我正在尝试为 ex 替换以下字符串:
来自
['55',2,1,10,30,23],
到
['55',2,555,10,30,23],
或
['55',2,1,10,30,23],
到
['55',2,1,10,9999,23],
我四处搜索并找到这个:
$ echo "[55,2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if(=="[55"){=10}{print}}'
[55,10,1,10,30,23],
但在我的情况下它不起作用,因为在我的 if 条件中 $1 的值附近有“ '”:
$ echo "['55',2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if(=="['55'"){=10}{print}}'
['55',2,1,10,30,23],
我想如何匹配和替换对你来说不是问题。您面临的问题是,如何在字段中匹配单引号 '
。
为了避免在代码中对每个 '
进行转义,并使代码更具可读性,您可以将引号分配给一个变量,并在代码中使用该变量,例如:
echo "['55' 1
['56' 1"|awk -v q="'" '=="["q"55"q{++}7'
['55' 2
['56' 1
在上面的示例中,仅与 ['55'
一致,第 2 个字段递增。
问题不在 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(=="['\'55\''"){=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 扩展的影响。
我正在尝试为 ex 替换以下字符串: 来自
['55',2,1,10,30,23],
到
['55',2,555,10,30,23],
或
['55',2,1,10,30,23],
到
['55',2,1,10,9999,23],
我四处搜索并找到这个:
$ echo "[55,2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if(=="[55"){=10}{print}}'
[55,10,1,10,30,23],
但在我的情况下它不起作用,因为在我的 if 条件中 $1 的值附近有“ '”:
$ echo "['55',2,1,10,30,23]," | awk -F',' 'BEGIN{OFS=","}{if(=="['55'"){=10}{print}}'
['55',2,1,10,30,23],
我想如何匹配和替换对你来说不是问题。您面临的问题是,如何在字段中匹配单引号 '
。
为了避免在代码中对每个 '
进行转义,并使代码更具可读性,您可以将引号分配给一个变量,并在代码中使用该变量,例如:
echo "['55' 1
['56' 1"|awk -v q="'" '=="["q"55"q{++}7'
['55' 2
['56' 1
在上面的示例中,仅与 ['55'
一致,第 2 个字段递增。
问题不在 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(=="['\'55\''"){=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 扩展的影响。