[英]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.