如何在鱼下使用awk将三元符号($$$)的字符串拆分为字段分隔符?

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
wan_XM 回答:如何在鱼下使用awk将三元符号($$$)的字符串拆分为字段分隔符?

该问题是由于fish quoting rules引起的。重要的区别是,与Bash不同,fish允许在单个引用的字符串中转义单个引用,如下所示:

$ echo '\''
'

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

$ echo '\\'
\

因此,要获取Bash中与\\相对应的内容,我们必须使用\\\\

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

awk和各种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
本文链接:https://www.f2er.com/2618628.html

大家都在问