使用 awk 时,我在打印(或搜索)包含反斜杠的序列时遇到问题 例如 -
echo "test\test" | awk '{ gsub(/\\\\t/, "\\\\&"); print }'
将给出结果:
test est
因为 \t 将被解释为制表符。我希望能够按原样保留字符串,意思是:
test\test
echo 命令只是我检查 awk 命令的 1 行的另一种方法,以查看它是否可以在文件中找到诸如 \t 之类的模式(使用 bash 脚本)。更具体地说 - 如果我想要一个 awk cmd 需要找到一系列
\"
我正在使用以下内容:
awk -v st="$match_string" 'BEGIN {gsub(/\\\\"/,"\\\\&", st)} match($0,st {print;exit}' file.txt
但 cmd 不起作用:对于具有以下内容的文件:
547 %$
236 \"
4523 &*
8876 (*
8756 "/
...
它将输出:
> \"
8756 "/
使用 awk 查找的正确方法是什么
236 \"
谢谢
答案1
是您echo
将 扩展\t
为制表符。不要用于echo
输出包含反斜杠的字符串。代替使用printf
。
printf '%s\n' 'test\test' | awk '{ print }'
也可以看看:
-
从那里带回家的信息是
POSIX 说:如果第一个参数是
-n
或任何参数包含反斜杠,则行为未指定。
考虑更新的问题:
您想要匹配\"
一些数据的第二列,并将字符串\"
作为程序的参数给出awk
:
string='\\"'
awk -v string="$string" '$2 == string' file
这将返回
236 \"
给出问题中的数据。请注意,您必须转义反斜杠,因为您需要在调用时在 shell 中扩展变量一次awk
。
您还可以使用
string='\"' awk '$2 == ENVIRON["string"]' file
即,将字符串作为环境变量传递到awk
程序中。在这种情况下,反斜杠确实不是需要逃脱。
要对整行使用正则表达式,请使用
string='\\\\"'
awk -v string="$string" '$0 ~ string' file
或者,
string='\\"' awk '$0 ~ ENVIRON["string"]' file
正则表达式中的反斜杠匹配是通过 完成的\\
,所以这就是我们必须传递给 的内容awk
。使用 时awk -v
,每个反斜杠需要加倍,因为$string
在调用 时会扩展命令行上的值awk
。
另请注意,如果您在使用将字符串传递到程序string
时使用双引号来设置值,则必须将所有双引号加倍awk -v
awk
再次(因为 shell 作用于双引号反斜杠),和转义字符串中的双引号:
string="\\\\\\\\\""
awk -v string="$string" '$0 ~ string' file
因此,这里的第一行在shell 中设置string
为,然后将根据我们需要将反斜杠和双引号匹配为正则表达式来求值。\\\\"
awk -v string="$string"
awk -v string='\\"'
答案2
只是echo "test\\test"
会做你想做的事,但如果你更喜欢 awk,你可以像这样打印它:
$ echo "test\test" | awk ' { print }'
test\test