Find
在 find 命令的正則表達式中使用修飾符?
我正在嘗試使用 find 命令的正則表達式來匹配使用點字元的換行符。這通常是通過
s
修飾符來完成的;但是,不同的正則表達式引擎有不同的格式,我無法確切地弄清楚如何編寫正則表達式,以便 find 命令匹配換行符。例如,我將如何更改以下簡單命令以匹配所有文件,包括名稱中包含換行符的文件:find /home/user -regex ".*"
我已經嘗試過
"(?s).*"
,"/.*/s"
,可能還有其他一些。
我的 GNU find 版本支持幾種不同的正則表達式變體,可以選擇
-regextype
:有效類型是 ‘findutils-default’、‘awk’、’egrep’、’ed’、’emacs’、‘gnu-awk’、‘grep’、‘posix-awk’、‘posix-basic’、‘posix- egrep’、‘posix-extended’、‘posix-minimal-basic’、‘sed’。
幾乎所有這些都讓點匹配換行符 …except
emacs
,這是預設設置。所以,使用其他的。
posix-extended
可能足夠理智:$ touch hello $'new\nline' $ find . -type f -regex '.*' ./hello $ find . -type f -regextype posix-extended -regex '.*' ./hello ./new?line
如果您正在執行其他一些
find
,您的里程可能會有所不同。在快速測試中,我 Mac 上的那個.
預設匹配換行符。再說一次,對於簡單的模式,你可以只使用
-name
which 接受 shell glob(並且不應該有換行的問題)。這
(?s)
看起來像是 PCRE/Perl 正則表達式的一個特性,我不認為find
支持這一點。至於/.*/s
,find
僅採用原始模式,沒有分隔符,因此沒有尾隨選項。