Digamos que eu tenho este arquivo:
hello
world
hello world
Este programa
#!/bin/bash
for i in $(cat $1); do
echo "tester: $i"
done
saídas
tester: hello
tester: world
tester: hello
tester: world
Eu gostaria que a for
iteração de cada linha ignorasse individualmente os espaços em branco, ou seja, as duas últimas linhas deveriam ser substituídas por
tester: hello world
O uso de aspas for i in "$(cat $1)";
resulta na i
atribuição de todo o arquivo de uma só vez. O que devo mudar?
fonte
<
um loop inteiro. Embora faça todo o sentido agora eu viIFS \ read -r line' in second example. Is really
IFS = `necessário? IMHO basta dizer:while read -r line; do echo "tester: $line"; done < "$1"
IFS=
desativa a remoção dos espaços em branco à esquerda e à direita. Consulte Emwhile IFS= read..
, por que o IFS não tem efeito?Pelo que vale a pena, eu preciso fazer isso com bastante frequência e nunca consigo me lembrar da maneira exata de usar
while IFS= read...
, então defini a seguinte função no meu perfil do bash:Essa função determina primeiro o número de linhas no arquivo, depois usa
sed
para extrair linha após linha e passa cada linha como um argumento de cadeia única para qualquer função. Suponho que isso possa ficar realmente ineficiente com arquivos grandes, mas isso não foi um problema para mim até agora (sugestões sobre como melhorar essa recepção, é claro).O uso é muito doce IMO:
fonte