繁体   English   中英

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM