Find
為什麼找不到 -regex 匹配換行符?
為什麼會失敗?
touch "$(printf "a\nb")"; find . -regex './.\n.'
我也嘗試了這些,但都不起作用:
find . -regextype posix-extended -regex '.\n.' find . -regextype posix-awk -regex '.\n.' find . -regextype posix-basic -regex '.\n.' find . -regextype posix-egrep -regex '.\n.'
它似乎工作的唯一方法是(感謝@MichaelMrozek)
find . -regex './.'$'\n''.'
至少可以說這很麻煩。那麼,為什麼 find 的正則表達式似乎無法處理
\n
呢?更新以響應迄今為止的答案:
好的,我知道這
\n
不是 ERE 的一部分,這是我的誤解之一,但find
聲稱支持posix-awk
兩者gawk
並按預期mawk
匹配:\n
$ printf "f1l1\nhas newline:f2l1#f1l2 does not:f2l2#" | mawk -F: 'BEGIN{RS="#"}; ($1~/\n/){print $1}' f1l1 has newline
我沒有一個純粹
awk
的測試,所以也許 POSIXawk
不匹配?不然是find
不是真的實現posix-awk
了正則表達式?
因為 GNU find 不支持
\n
轉義序列。正則表達式\n
匹配字元n
。GNU find 複製了傳統的 Emacs 語法,它也沒有這個特性¹。雖然 GNU find 支持其他正則表達式語法,但沒有一個支持反斜杠字母或反斜杠八進制來表示控製字元。您需要在參數中逐字包含控製字元。
周圍有許多不同的正則表達式語法。POSIX基本正則表達式(BRE) 和擴展正則表達式(ERE) 都不包含
\n
反斜杠八進制轉義符。當後面沒有未定義的特殊字元時,這兩個定義都保留了反斜杠的含義。實用程序awk和sed都支持\n
表示換行符;這是特定於這些實用程序的(並且很常見,但正如您所見並不普遍)。從一個shell腳本,你可以寫
find . -regex $'./.\n.' # ksh/bash/zsh only find . -regex './. .' find . -name '* *'
¹非常合乎邏輯:對於互動使用,您可以使用
C-q
;鍵入任何字元 對於程式用途,\n
作為字元串文字語法的一部分存在。