簡體   English   中英

魚中的全局匹配(通配符) shell 不匹配 bash 行為

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM