Como posso verificar se um arquivo já possui uma linha com “conteúdo”?

4

Eu preciso saber se um arquivo já tem linha com o conteúdo X nele, se não anexar linha. aqui está o código que eu tentei.

if ! $(grep 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' ~/.bashrc)
then
    echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >> ~/.bashrc
fi
    
por xenoterracide 12.01.2011 / 11:46

4 respostas

3
#!/bin/bash

LINE='eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)'

if ! grep -qF "$LINE" file.txt ; then echo "$LINE" >> file.txt ; fi

O $ (...) retornará o resultado do comando, não o valor errorlevel. Use sem substituição de comando para obter o código de retorno adequado.

    
por 12.01.2011 / 12:39
1

Para pesquisar por uma string literal:

line='eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)'
file=~/.bashrc
if ! grep -q -x -F -e "$line" <"$file"; then
  printf '%s\n' "$line" >>"$file"
fi

-q suprime grep output (você está interessado apenas no status de retorno). -x requer que a linha inteira corresponda. -F procura uma string literal em vez de um regexp. -e é uma precaução no caso de $line começar com - .

    
por 12.01.2011 / 22:26
0

Você pode ter mais sorte com a função awk do index : é equivalente a strstr , portanto deve ser bem adequado para comparação (em oposição a grep , que é para correspondência de padrões). / p>     

por 12.01.2011 / 12:17
0

Você pode fazer isso com sed. A questão é que você precisa incluir a string no código duas vezes. Uma vez para testá-lo, novamente para inseri-lo.

sed -i '/eval \$(perl -I\$HOME\/foo\/lib\/perl5 -Mlocal::lib=\$HOME\/foo)/!{ ${ s/$/\neval \$(perl -I\$HOME\/foo\/lib\/perl5 -Mlocal::lib=\$HOME\/foo)/; }; }' /path/to/file
    
por 12.01.2011 / 23:32