echo "A:\ B:\ C:\ D:\" | awk -F'[:\]' '{print $1}'
输出:
awk: warning: escape sequence `\]' treated as plain `]'
A
我收到了上述警告信息,我尝试了多种选项来逃避]
,但这并没有解决。
我想同时使用分隔符:\
并通过打印A
精确打印字母B
,C
,D
,$1
,$2
,$3
,$4
。
答案 0 :(得分:7)
我认为这是你正在尝试做的事情:
$ echo 'A:\ B:\ C:\ D:\' | awk -F':\\\\[[:space:]]*' '{print $2}'
B
请注意,我添加了[[:space:]]*
,因为我认为您不希望$1
之后的字段中有前导空格。
在FS
设置中使用的字符串文字会被解析两次,一次在脚本被读取时再次被执行,因此转义需要加倍(google it和/或阅读awk手册页或书) 。在这种情况下,第一次传递\\\\
转换为\\
,第二次传递\\
转换为\
,这就是您想要的。
答案 1 :(得分:0)
这也是错误的:
echo "A:\ B:\ C:\ D:\"
您正在转义"
并且它会中断输入,您需要删除它或使用单引号。
awk
不喜欢字段分隔符中的单个\
,因此请尝试:
echo 'A:\ B:\ C:\ D:\' | awk -F":|\\" '{print $1}'
A
或者你可以逃避它(单引号):
echo 'A:\ B:\ C:\ D:\' | awk -F'[:\\\\]' '{print $1}'
A
甚至更多逃避(双引号):
echo 'A:\ B:\ C:\ D:\' | awk -F"[:\\\\\\\]" '{print $1}'
A