Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 如何在awk中使用包含特殊符号的变量?_Variables_Awk_Symbols_Backslash - Fatal编程技术网

Variables 如何在awk中使用包含特殊符号的变量?

Variables 如何在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

在我的例子中,如果发现某个模式作为文件中一行的第二个字段,那么我需要打印前两个字段。它应该能够处理像反斜杠这样的特殊符号

我的解决方案是首先使用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 " "     $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