- Como Detectar padrão no final de uma linha com grep , mas para arquivos DOS de terminadores de linha CRLF.
- Como em https://unix.stackexchange.com/a/462633/374303 , uma maneira é usar
dos2unix
, mas não tenho no meu servidor remoto.
Ou seja, \r
não está funcionando grep
no modo Expressão Regular Estendida?:
$ 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
Eu pensei que \r
faz parte das Expressões Regulares Estendidas, como em
https://valelab4.ucsf.edu/svn/3rdpartypublic/boost/libs/regex/doc/html/boost_regex/syntax/basic_extended.html . Não?
Ou é realmente uma limitação de grep
?
Não,
\r
não faz parte do padrão básico nem das expressões regulares estendidas , exceto emawk
, embora algunsgrep
s o suportem como uma extensão como ogrep
from ast-open que o suporta em todos os seus sabores regexp (com-E
,-X
e-P
com o BRE padrão).No entanto, faz parte das
perl
expressões regulares, assim como das PCRE, portanto, deve ser suportada porgrep
implementações que suportem a-P
para elas.A maioria dos shells atualmente suporta a
$'...'
forma de aspas de ksh93, onde\r
é expandido para um retorno de carro. Então, com eles, você pode fazer:PCRE permite especificar o tipo de delimitador de linha com diretivas como
(*LF)
,(*CRLF)
,(*CR)
, mas que não pode ser usadogrep -P
mesmo naqueles onde a correspondência tipo perl é implementada usando PCRE, porquegrep
funciona no conteúdo de uma linha (delimitada por LF) em uma vez, para que o LF não seja encontrado na string com a qual o regexp corresponde.Pode ser usado no entanto no modo
pcregrep
ultiline doM
:(
sed -n l
para revelar o CR como\r
).Com GNU
grep
, você pode usá-lo com o-z
sinalizador que o faz funcionar em registros delimitados por NUL em vez de linhas:(também habilitando o
m
sinalizador ultiline para$
corresponder no final de cada linha, além do final do registro, etr
ansliterando os NULs para LF na saída para exibição).