如何在 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
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