如何在 fish 下使用 awk 将字符串拆分为三个美元符号 ($$$) 作为字段分隔符?

How to use awk under fish to split a string by triple dollar signs ($$$) as field separator?

awk -F '$' 适用于单个美元符号分隔的字符串(例如 a$b$c),但当涉及多个美元符号时,awk 不起作用。

预期的输出是:1,我尝试了以下组合但没有成功:

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

我想知道是否有办法使用 awk 按美元符号序列拆分字符串?

更新

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

更多\

#> printf '1$$6' | awk -F '\$\$\$' '{print }'
1

如果 awk 会让你变弯,也许就不要使用它了?

$: echo '1$$6' | sed 's/$$$.*//'
1

为什么要把它完全交给一个子 shell 来进行字符串处理?

$: x='1$$6'
$: echo "${x%%$$$*}"
1

awk 和各种 shell 具有使用反斜杠转义字符的不良行为。不同的 shell 可能有不同的行为,有时你真的需要像疯了一样逃跑才能让它工作。最简单的方法是对单个符号使用 [$]。这始终适用于字段分隔符,因为 FS 是一个正则表达式,如果它不止一个符号。

$ awk -F '[$][$][$]' '{...}' file

问题是由于 fish quoting rules。重要的区别在于,与 Bash 不同,fish 允许在单引号字符串中转义单引号,例如:

$ echo '\''
'

因此,文字反斜杠也必须转义:

$ echo '\'
\

所以,要得到 Bash 中对应于 \ 的内容,我们必须使用 \\:

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