[英]How to use awk under fish to split a string by triple dollar signs ($$$) as field separator?
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
问题是由于鱼的引用规则。 重要的区别在于,与 Bash 不同,fish 允许在单引号字符串中转义单引号,如下所示:
$ echo '\''
'
因此,文字反斜杠也必须转义:
$ echo '\\'
\
因此,要获得 Bash 中对应于\\\\
,我们必须使用\\\\\\\\
:
$ printf '1$23$$$456' | awk -F '\\\\$\\\\$\\\\$' '{print $1}'
1$23
awk 和各种 shell 具有使用反斜杠转义字符的令人讨厌的行为。 各种 shell 可能有不同的行为,有时你真的需要像疯了一样逃跑才能让它工作。 最简单的方法是将[$]
用于单个符号。 这始终适用于字段分隔符,因为如果FS
是多个符号,则它是一个正则表达式。
$ awk -F '[$][$][$]' '{...}' file
更多的 \\
#> printf '1$23$$$456' | awk -F '\\$\\$\\$' '{print $1}'
1$23
如果这会让你弯曲,也许不使用 awk ?
$: echo '1$23$$$456' | sed 's/$$$.*//'
1$23
为什么要把它放到一个子 shell 中来做一些只是字符串处理的事情?
$: x='1$23$$$456'
$: echo "${x%%\$\$\$*}"
1$23
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.