Eu uso Linux. Há um ^ M irritante (retorno de cartografia do Windows) em algum lugar escondido em milhares de arquivos de configuração, e preciso encontrá-lo, porque isso faz com que o servidor falhe.
Como encontro ^ M em uma hierarquia de diretórios cheia de arquivos de configuração?
Acho que não consigo inserir ^ M na linha de comando do bash. Mas eu o tenho em um arquivo de texto que chamei m.txt
Respostas:
Use
-r
para pesquisa recursiva e$''
para escape no estilo c no Bash.Além disso, se você tem certeza de que é um arquivo de texto, deve ser seguro executar
para remover tudo
\r
em um arquivo.Se você usa o GNU
sed
,-i
pode executar edições no local, para que não precise escrever de volta:fonte
$'\r'
.$'
leia o primeiro hit na página de manualbash(1)
, basicamente, você pode vê-lo como se estivesse escrevendo uma string literal C. Quantocommand < filename
ao uso de<
ou>
é chamado de redirecionamento , é a primeira vez que vejo alguém chamar isso de maior expressão . PesquisarREDIRECTION
embash(1)
.Quando tentei, percebi que estava meio que funcionando, mas as linhas estavam imprimindo em branco. Adicione na opção:
Se você receber esse problema, acho que são os caracteres de escape do realce de cores que interferem no
\r
personagem.fonte
Se o servidor não tiver um shell bash, uma alternativa é usar a
-f
opçãogrep
, em combinação com um arquivo preparado contendo\r
.Para criar o arquivo:
Para realmente fazer a pesquisa
ou você pode ser um pouco preguiçoso e apenas digitar *,
A opção ativada é usada para especificar um arquivo que contém padrões para corresponder, um por linha. Nesse caso, há apenas um padrão.
-f filename
grep
fonte
Se eu entendi sua pergunta corretamente, o que você realmente deseja é normalizar todas as terminações de linhas no
\x0a
padrão Unix LF ( ). Isso não é o mesmo que remover cegos CRs (\x0d
).Se você tiver alguns arquivos do Mac que usam apenas CR para novas linhas, você os destruirá. (Sim, os Macs devem usar o LF há quase 20 anos, mas ainda existem (em 2019) muitos aplicativos para Mac que usam apenas CR).
Você pode usar o
\R
escape de quebra de linha do Perl para substituir qualquer tipo de nova linha\n
.Isso substituiria no local qualquer tipo de quebra de linha por
\n
in$your_file
, mantendo um backup do arquivo original${your_file}.bak
.fonte
Para usar grep em caracteres de fim de linha, acho que você precisa informar ao grep que o arquivo é binário.
-l (letra L) é para imprimir apenas o nome do arquivo
-P é para perl regexp (então \ x0d é transformado em \ r ou ^ M)
fonte
Se você estiver em um Mac e usar o homebrew , poderá:
remover todos os retornos de carro do Windows de file.txt
Para voltar aos retornos de carro do Windows,
fonte
No estilo de expressão regular, várias novas linhas:
Windows (CR LF)
\r\n
Unix (LF)
\n
Como a
\r\n
sequência é bastante única, acho que você deve procurar dessa maneira?Para piorar as coisas, os Macs costumavam ter apenas '\ r' no lugar da nova linha. Não posso verificar isso, mas acho que as gerações do MacOSX não fazem mais isso.
Macs mais antigos (CR)
\r
fonte
grep "\r\n" *
não dá resultado. Nenhum resultado paraegrep -e "\r\n" *
norgrep -E "\r\n" *
\r
meu mal. A janela de nova linha completa de fato\r\n
ou CRLFSeguindo as respostas anteriores, o método 'tr' é bom:
533 $ if [[-n "
tr -cd "\r" <~/.bashrc
"]]; depois ecoar "DOS"; else echo "UNIX"; fiUNIX
534 $ if [[-n "
tr -cd "\r" <dosfile.txt
"]]; depois ecoar "DOS"; else echo "UNIX"; fiDOS
fonte