Variables 如何在awk中使用包含特殊符号的变量?
在我的例子中,如果发现某个模式作为文件中一行的第二个字段,那么我需要打印前两个字段。它应该能够处理像反斜杠这样的特殊符号 我的解决方案是首先使用sed将\替换为\\,然后将新变量传递给awk,然后awk将\\as\解析,然后匹配字段2Variables 如何在awk中使用包含特殊符号的变量?,variables,awk,symbols,backslash,Variables,Awk,Symbols,Backslash,在我的例子中,如果发现某个模式作为文件中一行的第二个字段,那么我需要打印前两个字段。它应该能够处理像反斜杠这样的特殊符号 我的解决方案是首先使用sed将\替换为\\,然后将新变量传递给awk,然后awk将\\as\解析,然后匹配字段2 escaped_str=$( echo "$pattern" | sed 's/\\/\\\\/g') input | awk -v awk_escaped_str="$escaped_str" '$2==awk_escaped_str { $0=$1
escaped_str=$( echo "$pattern" | sed 's/\\/\\\\/g')
input | awk -v awk_escaped_str="$escaped_str" '$2==awk_escaped_str { $0=$1 " " $2 " "}; { print } '
而这似乎过于复杂,无法处理各种情况
有没有更好的方法更简单,可以覆盖所有其他特殊符号?有三种变体,您可以尝试,而无需逃避您的模式: 这个测试文本字符串。未解释任何正则表达式实例:
$2 == expr
这一个测试文本字符串是否为子集:
index($2, expr)
这一个测试正则表达式模式:
$2 ~ pattern
将shell变量传递给awk而不解释反斜杠的方法是在arg列表中传递它,而不是在脚本之外填充awk变量:
$ shellvar='a\tb'
$ awk -v awkvar="$shellvar" 'BEGIN{ printf "<%s>\n",awkvar }'
<a b>
$ awk 'BEGIN{ awkvar=ARGV[1]; ARGV[1]=""; printf "<%s>\n",awkvar }' "$shellvar"
<a\tb>
填充awk变量后,需要设置
ARGV[1]=“”
,以避免shell变量值也被视为文件名。与任何其他传入变量的方式不同,以这种方式在变量中使用的所有字符都被逐字处理,没有“特殊”含义。您的模式是什么样子的$awk\u escaped\u str
不应该有$
。谢谢,它可以工作。正如我所尝试的,这也可以工作:awk'BEGIN{printf“\n”,ARGV[1]}'”$shellvar“那么,将ARGV[1]传递给awkvar,然后在awk脚本中使用awkvar有什么好处吗?或者两者都可以。请注意我在回答底部所说的内容-您必须在开始部分结束之前设置ARGV[1]=”
,否则awk将尝试以文件形式打开它包含的任何值,因此除非您计划在开始部分执行所有处理,否则您别无选择,只能从ARGV[1]填充awk变量在清理它之前。很漂亮!!我只是用了这个聪明的方法。
$ cat file
a b
a\tb
$ awk 'BEGIN{ awkvar=ARGV[1]; ARGV[1]="" } index($0,awkvar)' "$shellvar" file
a\tb
$ awk 'BEGIN{ awkvar=ARGV[1]; ARGV[1]="" } $0 == awkvar' "$shellvar" file
a\tb