Awk обработка имен файлов, содержащих безумие с обратной косой чертой - PullRequest
0 голосов
/ 11 декабря 2011

Я провел целый день, пытаясь обработать некоторые файлы с обратной косой чертой и пробелами внутри их имен.Независимо от того, что я делаю, 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

Это не сработало, поскольку backspace попадает непосредственно в код 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 сказал какую-то ерунду о неоконченном регулярном выражении.

Есть идеи?Спасибо!

Ответы [ 3 ]

1 голос
/ 27 января 2012

Исправление состоит в том, чтобы просто удваивать каждый обратный слеш, который подается в mawk, либо во входных данных, либо через переменные. Как это:

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

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

Поэтому, если имя файла, содержащее обратную косую черту, передается внутри $ 1, вы получите ожидаемый результат.

1 голос
/ 11 декабря 2011

Вы решаете не ту проблему: независимо от инструмента, обратная косая черта и пробелы в именах файлов в UNIX-системах всегда будут означать дополнительную работу.По моему мнению, вы должны санировать имена файлов, а затем обрабатывать их.

Попробуйте:

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

HTH Крис

0 голосов
/ 12 декабря 2011

Я не понимаю, почему ты пишешь в xargs.Это требование вашего процесса?Можете ли вы сделать что-то вроде этого:

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