試圖找到一個足夠靈活的命令,以允許字串的某些變體,但不允許字串的其他變體。
例如,我正在尋找僅在檔案名中有一些“雨”變體的音頻檔案(下雨、下雨、下雨、彩虹、降雨、烏云等),無論是在開頭、結尾還是中間檔案名。
但是,這也包括諸如“大腦”、“火車”、“谷物”、“排水”、“洛林”等不想要的詞(基本上任何與雨的概念無關的詞)。
這樣的事情失敗了:
find . -name '*rain*' ! -name '*brain*'| more
而且我什至開始構建成功的正則運算式變體都沒有運氣,因為我無法將注意力集中在正則運算式上……例如,這沒有任何作用:
# this is incomplete, just a stub of where I was going
# -type f also still includes a directory name
find . -regextype findutils-default -iregex '\(*rain*\)' -type f
任何幫助將不勝感激。如果我能看到一個正則運算式命令,它可以完成我想要它做的所有事情,并解釋了命令中的每個字符,它將幫助我更多地了解使用 find 命令的正則運算式。
編輯1:
從 jhnc 和 Seth Falco 迄今為止的所有反饋中獲取線索,我已經嘗試過這個:
find . -type f | grep -Pi '(?<![a-zA-Z])rain'
我認為這非常有效(我認為它沒有遺漏任何東西),我唯一的問題是它也匹配路徑上更遠的“雨”的出現,不僅在檔案名中。所以我得到這樣的示例輸出:
./Linux/path/to/radiohead - 2007 - in rainbows/09 Jigsaw Falling Into Place.mp3
由于“rain”不在檔案名本身中,這是我不想看到的結果。所以我嘗試了這個:
find . -type f -printf '%f\n' | grep -Pi '(?<![a-zA-Z])rain'
這確實確保只有檔案名匹配,但它也不會輸出檔案名的路徑,我仍然希望看到,所以我知道檔案在哪里。
所以我想我真正需要的是一個 PCRE(PCRE2 ?),它可以采用看似成功的后視方法,但只能在最后一個路徑分隔符之后應用它(/ 因為我在 Linux 上),我仍然很難過。
uj5u.com熱心網友回復:
規格:
- 匹配“雨”
- 在檔案名中
- 僅在詞首
- 不區分大小寫
假設:
- 將“單詞”定義為字母序列(無標點符號、數字等)
- 路徑有形式
prefix/name,其中prefix可以有一個或多個級別分隔/并且名稱不包含/
約束:
find -iregex匹配整個路徑(-name僅匹配檔案名)find -iregex必須匹配整個路徑(例如,“c”只是部分匹配,不匹配路徑“a/b/c”)
方法:
find可以回傳對非檔案(例如目錄)的匹配。給定定義 6,我們將無法判斷name是目錄還是普通檔案。find為了滿足 2,我們可以使用的-type f謂詞排除非檔案。
我們可以通過使用不區分大小寫的正則運算式匹配謂詞 ( )將找到的路徑find與我們的規范進行比較。“grep”風味 ( ) 具有足夠的表現力。find-iregex-regextype grep
只需使用 1,一個合適的正則運算式是:rain
/2 6 7 表示我們必須在“下雨”之后禁止:rain[^/]*$
[/]匹配集合中的字符(即。/)[^/]:^反轉匹配:即。不是的字符/*匹配前面的匹配零次或多次$約束前面的匹配發生在輸入的末尾
3 5 表示必須沒有緊接在前面的單詞字符:[^a-z]rain[^/]*$
a-z是范圍的快捷a方式z
8 需要明確匹配前綴:^.*[^a-z]rain[^/]*$
^約束之外的[...]后續匹配發生在輸入的開頭.匹配任何東西[^a-z]匹配非字母
最終命令列:
find . -type f -regextype grep -iregex '^.*[^a-z]rain[^/]*$'
注意:前導^和尾隨$實際上不是必需的,給定 8,可以省略。
讀者練習:
- 將“單詞”擴展到非 ASCII 字符(例如 UTF-8)
uj5u.com熱心網友回復:
您可能想要使用字符類、單詞邊界,或者只是對字母字符進行否定查看。
向后看
(?<![a-zA-Z])rain
匹配 的任何實體rain,但前提是它不跟隨[a-zA-Z]。不幸的是,find不支持向前看或向后看……所以我們將使用一個字符類來代替。
字符類
(?:^|[^a-zA-Z])rain
匹配行的開頭,或者不是的字符[a-zA-Z],然后繼續匹配字符,rain如果它緊隨其后。
你可以find像這樣使用它:
find ./ -iregex '.*(?:^|[^a-zA-Z])rain.*'
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/486161.html
