Find

為什麼找不到 -regex 匹配換行符?

  • March 10, 2014

為什麼會失敗?

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反斜杠八進制轉義符。當後面沒有未定義的特殊字元時,這兩個定義都保留了反斜杠的含義。實用程序awksed都支持\n表示換行符;這是特定於這些實用程序的(並且很常見,但正如您所見並不普遍)。

從一個shell腳本,你可以寫

find . -regex $'./.\n.'     # ksh/bash/zsh only
find . -regex './.
.'
find . -name '*
*'

¹非常合乎邏輯:對於互動使用,您可以使用C-q;鍵入任何字元 對於程式用途,\n作為字元串文字語法的一部分存在。

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