[英]Glob matching (wildcards) in fish shell not matching bash behavior
當我在 bash 中執行以下命令時,我得到一個與我想要的正則表達式匹配的文件列表:
$> ls *-[0-9].jtl
benchmark-1422478133-1.jtl benchmark-1422502883-4.jtl benchmark-1422915207-2.jtl
但是,當我在魚 shell 中運行相同的命令時,會得到不同的結果:
$> ls *-[0-9].jtl
fish: No matches for wildcard '*-[0-9].jtl'.
ls *-[0-9].jtl
^
怎么來的?
Fish 的文檔並未聲稱支持 POSIX glob 模式的全部功能。
引用文檔:
通配符
如果參數中出現星號 (*) 或問號 (?),fish 會嘗試將給定參數與任何文件匹配,其方式如下:
?
可以匹配除/
之外的任何單個字符。*
可以匹配任何不包含/
的字符串。 這包括匹配一個空字符串。**
匹配任何字符串。 這包括匹配一個空字符串。 字符串可能包含/
字符,但不是必須的。
值得注意的是,沒有提到字符類,因為魚不支持它們。
如果您希望 glob 保證支持所有 POSIX (fnmatch) 功能,請使用符合 POSIX 或 POSIX 超集的 shell。
您還可以使用更多擴展工具 unix find
。 它非常強大。
示例:使用正則表達式
find . -path '.*-[0-9].jtl' -not -path '.*-32.jtl'
這是一篇較舊的帖子,但我認為值得重溫。 在撰寫本文時(2021 年 3 月),文檔確實明確說明了支持通配符。
Fish 支持熟悉的通配符 *。 列出所有 JPEG 文件:
> ls *.jpg lena.jpg meena.jpg santa maria.jpg
您可以包含多個通配符:
> ls l*.p* lena.png lesson.pdf
特別強大的是遞歸通配符**,它遞歸地搜索目錄:
> ls /var/**.log /var/log/system.log /var/run/sntp.log
但是,我仍然經常遇到同樣的問題
[/home/glass ]
><glass@rockpiX-Ubuntu> rm *.log.old
fish: No matches for wildcard “*.log.old”. See `help expand`.
rm *.log.old
^
在fish 3+中,您可以string match
:
ls | string match -r --entire '-[0-9].jtl'
選項:
-r
: 正則表達式--entire
:返回整個匹配字符串Fish 只需要引用即可與 bash 相同。
在 bash .conf 中的魚“ .conf”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.