簡體   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