Em vários lugares da web, encontrei:
\015
\012
\x0a - hex
\n
\r
tudo como sinônimo de várias novas linhas / retornos de carro ...
Mas neste pequeno script que não consigo reconhecer quando me deparo com uma nova linha - alguém pode me dizer o que devo procurar na linha if?
#!/bin/bash
test="this is a
test"
for a in "$test"; do
if [[ "$a" == '\012' ]] ; then
echo "FOUND NEWLINE"
fi
echo "$a"
done
cat | while read line; do ...; done
, sabe que houve um retorno de carro para cada iteração. Se sua entrada puder ser arquivos\r
sem\n
, apenas transforme o arquivotr '\r' '\n'
enquanto processa a entrada. Se você só precisa saber se existem várias linhas:wc -l
.wc -l
retornará 0; você deve adicionar isso como respostaRespostas:
Se você usar diretamente as strings em um
for
loop, ele funcionará por palavra (aqui em uma palavra: todo o conteúdo$test
desde que foi citado), não por caractere. Você precisa usar umwhile
loop comread
para analisar letra por letra ou para introduzir um parâmetro numérico que itere sobre a string.Além disso, ao usar
read
, você precisa garantir que novas linhas e espaços em branco não sejam interpretados como delimitadores e forçarread
a leitura de um caractere de cada vez.Aqui está uma versão de trabalho:
Você pode substituir
$'\n'
por$'\012'
ou$'\x0a'
, pois todos eles representam o mesmo código de nova linha. Mas não é o mesmo que\015
ou\r
- isso significa retorno de carro (retorno ao início da linha). Nos sistemas Linux, as novas linhas são representadas usando\n
, mas no Windows, por exemplo, elas são representadas por uma sequência\r\n
. Por isso, se você tiver um arquivo de texto do Windows, poderá detectar novas linhas também pesquisando\r
.fonte
\n
em sua representação de bytes, para que você não precise colocar quebras de linha entre aspas e aparência feia em sua declaração de teste.Você pode verificar novas linhas em uma variável muito facilmente no bash com:
Acho mais conveniente usar:
fonte
Eu sugiro usar
tr
e depoistest
:O
tr -cd
remove tudo, exceto as novas linhas / retornos de carro. Se houver novas linhas no arquivo, haverá saída a partir da qual o-n
teste retornará verdadeiro.fonte
\r
s porque a substituição de comandos remove os caracteres de nova linha à direita ("$(printf '\n\n\n\n\n')"
é a string vazia).