Find

在 find 命令的正則表達式中使用修飾符?

  • September 1, 2021

我正在嘗試使用 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 上的那個.預設匹配換行符。

再說一次,對於簡單的模式,你可以只使用-namewhich 接受 shell glob(並且不應該有換行的問題)。

(?s)看起來像是 PCRE/Perl 正則表達式的一個特性,我不認為find支持這一點。至於/.*/sfind僅採用原始模式,沒有分隔符,因此沒有尾隨選項。

引用自:https://unix.stackexchange.com/questions/667224