Как использовать awk под fi sh, чтобы разделить строку на тройные знаки доллара ($$$) в качестве разделителя полей? - PullRequest
0 голосов
/ 19 марта 2020

awk -F '$' хорошо работает со строкой, разделенной знаком доллара (например, a$b$c), но когда дело доходит до нескольких знаков доллара, awk не работает.

Ожидаемый результат это: 1$23, я пробовал следующие комбинации, но напрасно:

$ printf '1$23$$$456' | awk -F '$$$' '{print $1}'
1$23$$$456
$ printf '1$23$$$456' | awk -F '\$\$\$' '{print $1}'
1$23$$$456
$ printf '1$23$$$456' | awk -F '\\$\\$\\$' '{print $1}'
1$23$$$456
$ printf '1$23$$$456' | awk -F '$' '{print $1}'
1

Интересно, есть ли способ разбить строку по последовательности знаков доллара с помощью awk?

обновление

$ awk --version
awk version 20070501
$ echo $SHELL
/usr/local/bin/fish

Ответы [ 4 ]

3 голосов
/ 19 марта 2020

Проблема связана с fi sh правилами цитирования . Важным отличием является то, что fi sh, в отличие от Bash, позволяет экранировать одиночную кавычку в одной строке в кавычках, например, так:

$ echo '\''
'

и, следовательно, буквальный обратный символ sh должен быть также экранированным:

$ echo '\\'
\

Итак, чтобы получить то, что в Bash соответствует \\, мы должны использовать \\\\:

$ printf '1$23$$$456' | awk -F '\\\\$\\\\$\\\\$' '{print $1}'
1$23
2 голосов
/ 19 марта 2020

awk и различные оболочки имеют неприятное поведение с экранированием персонажей с обратной косой чертой. Различные оболочки могут иметь различное поведение, и иногда вам действительно нужно убежать, как сумасшедший, чтобы заставить это работать. Самый простой - использовать [$] для одного символа. Это всегда работает для разделителей полей, поскольку FS является регулярным выражением, если оно содержит более одного символа.

$ awk -F '[$][$][$]' '{...}' file
0 голосов
/ 19 марта 2020

Может быть, не использовать awk, если он бросает вам кривые?

$: echo '1$23$$$456' | sed 's/$$$.*//'
1$23

Зачем вообще выводить его в подоболочку для чего-то, что просто является обработкой строк?

$: x='1$23$$$456'
$: echo "${x%%\$\$\$*}"
1$23
0 голосов
/ 19 марта 2020

Подробнее \

#> printf '1$23$$$456' | awk -F '\\$\\$\\$' '{print $1}'
1$23
...