Grep

grep 從 DOS 文件中搜尋行尾模式

  • October 6, 2022

即,\r不適用於grep擴展正則表達式模式?:

$ printf 'abcd\r\n' | grep -Ec 'd\r$'
0

$ printf 'abcd\r\n' | grep -c 'd.$'
1

$ printf 'abcd\r\n' | grep -Pc 'd\r$'
1

我認為\r是擴展正則表達式的一部分,就像在 https://valelab4.ucsf.edu/svn/3rdpartypublic/boost/libs/regex/doc/html/boost_regex/syntax/basic_extended.html中一樣。不?

或者它確實是一個限制grep

不,除了in\r之外,它不是標準基本正則表達式的一部分,也不是擴展正則表達式的一部分,儘管有些s 支持它作為擴展,如from ast-open 支持它的所有正則表達式風格(使用、和預設 BRE)。awkgrep``grep``-E``-X``-P

雖然它是正則表達式的一部分,perl但也是 PCRE 的一部分,因此應該由grep支持 a 的實現來支持-P

如今,大多數 shell 都支持$'...'ksh93 中的引號形式,其中\r擴展為輸入符。所以有了這些,你可以這樣做:

grep $'d\r$'

(*LF)PCRE 允許使用, (*CRLF),等指令指定行分隔符的類型(*CR),但grep -P即使在使用 PCRE 實現類似 perl 的匹配的情況下也不能使用,因為grep它適用於一個(LF 分隔)行的內容一次,因此在正則表達式匹配的字元串中找不到 LF。

然而,它可以在pcregrep’s Multiline 模式下使用:

$ printf '%s\r\n' foo abcd bar | pcregrep -M '(*CRLF)d$' | sed -n l
abcd\r$

sed -n l將 CR 顯示為\r)。

使用 GNU grep,您可以將其與-z標誌一起使用,使其適用於 NUL 分隔的記錄而不是行:

$ printf '%s\r\n' foo abcd bar | grep -oPz '(*CRLF)(?m).*d$' | tr '\0' '\n' | sed -n l
abcd$

(除了在記錄的末尾之外,還啟用multiline 標誌$以匹配每行的末尾,並將trNUL 解析為 LF 在輸出上進行顯示)。

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