Grep
grep 從 DOS 文件中搜尋行尾模式
- 就像使用 grep 在行尾檢測模式一樣,但對於 CRLF 行終止符的 DOS 文件。
- 就像在https://unix.stackexchange.com/a/462633/374303中一樣,一種方法是使用
dos2unix
,但我的遠端伺服器中沒有它。即,
\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)。awk
grep``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
’sM
ultiline 模式下使用:$ 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$
(除了在記錄的末尾之外,還啟用
m
ultiline 標誌$
以匹配每行的末尾,並將tr
NUL 解析為 LF 在輸出上進行顯示)。