【发布时间】:2012-01-17 19:16:24
【问题描述】:
我花了一整天的时间来处理一些名称中带有反斜杠和空格的文件。无论我做什么 awk (gawk) 都拒绝打印反斜杠:
echo "this/pathname/contains/spa ces/and/back\\slashes" | xargs -d'\n' -n1 -I{} bash -c 'echo "{}"; echo whatever | gawk "{printf {}}"'
this/pathname/contains/spa ces/and/back\slashes
gawk: {printf this/pathname/contains/spa ces/and/back\slashes}
gawk: ^ syntax error
gawk: {printf this/pathname/contains/spa ces/and/back\slashes}
gawk: ^ backslash not last character on line
这不起作用,因为退格键直接进入 awk 代码。
echo "this/pathname/contains/spa ces/and/back\\slashes" | xargs -d'\n' -n1 -I{} bash -c 'echo "{}"; echo whatever | gawk "{printf \"{}\"}"'
this/pathname/contains/spa ces/and/back\slashes
gawk: warning: escape sequence `\s' treated as plain `s'
this/pathname/contains/spa ces/and/backslashes
这行得通,但 awk 吃掉了反斜杠。正如您在上面看到的,echo 会打印它,但 awk 不会。
echo "this/pathname/contains/spa ces/and/back\\slashes" | ./escape.sh | xargs -d'\n' -n1 -I{} bash -c 'echo "{}"; echo whatever | gawk "{printf \"{}\"}"'
this/pathname/contains/spa\ ces/and/back\slashes
gawk: warning: escape sequence `\ ' treated as plain ` '
gawk: warning: escape sequence `\s' treated as plain `s'
接下来我尝试使用 escape.sh 转义文件名
#!/bin/bash
xargs -d'\n' -n1 -I{} bash -c 'echo $(printf "%q" "{}")'
现在那里有一个双反斜杠,但 awk 仍然抱怨。
echo "this/pathname/contains/spa ces/and/back\\slashes" | ./escape.sh | xargs -d'\n' -n1 -I{} bash -c 'echo "{}"; echo whatever | gawk -v VAR=$(printf "%q" "{}") "{printf VAR}"'
this/pathname/contains/spa\ ces/and/back\slashes
gawk: ces/and/back\\slashes
gawk: ^ syntax error
gawk: ces/and/back\\slashes
gawk: ^ unterminated regexp
现在 awk 对一些未终止的正则表达式说了一些废话。
有什么想法吗?谢谢!
【问题讨论】:
-
你的预期输出是什么?
-
预期输出是 echo 输出:
this/pathname/contains/spa ces/and/back\slashes -
有趣的注释:使用 mawk 我没有问题,只有 gawk;我仍然试图不依赖 awk 的特定风格
-
我不确定我是否听懂了你的问题。如果您只想打印 \ 那么这工作正常。
[jaypal:~/Temp] awk 'BEGIN{print "this/pathname/contains/spa ces/and/back\\slashes"}' this/pathname/contains/spa ces/and/back\slashes -
为什么要使用这个 xargs/shell 处理?只有在某些情况下,反斜杠才会出现问题:转到 here 并搜索反斜杠。