【问题标题】:Awk processing of filenames containing backslash madness包含反斜杠疯狂的文件名的 awk 处理
【发布时间】: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 并搜索反斜杠。

标签: awk filenames backslash


【解决方案1】:

您正在解决错误的问题:无论使用何种工具,UNIX 系统上文件名中的反斜杠和空格总是意味着额外的工作。我认为你应该清理文件名,然后处理它们。

试试:

sed "s/ /_/g;s/\\\\/-/g"

HTH 克里斯

【讨论】:

  • 这里的 tr ' \' '_-' 比 sed 更容易使用。
【解决方案2】:

解决方法是将输入到 mawk 的每个反斜杠加倍,无论是在输入中还是通过变量。 像这样:

# awk needs escaped backslashes
VAR=$(echo "$1" | sed -r 's:\\:\\\\:g')

mawk -v VAR="$VAR" -f "script.awk"

因此,如果在 $1 中传递包含反斜杠的文件名,这就是您获得预期结果的方式。

【讨论】:

    【解决方案3】:

    我不明白你为什么要输入 xargs。这是您的流程的要求吗?你能做这样的事情吗:

    filename='this/pathname/contains/spa ces/and/back\slashes'
    awk -v "fname=$filename" 'BEGIN {print fname}'
    

    【讨论】:

    • 是的,我需要 xargs,这只是我正在做的一个简化示例。我尝试通过变量将字符串交给 awk,但它不起作用。
    • 尝试分享您真正的问题,也许是在一个新问题中。你说你需要 xargs,但我怀疑你只是专注于这一点,而不是对不同的解决方案持开放态度。
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2015-10-03
    • 2017-10-16
    相关资源
    最近更新 更多