¿Cómo puedo verificar si un file ya tiene una línea con "contenido"?

Necesito saber si un file tiene una línea con el contenido X en él, si no agrega una línea. aquí está el código que probé.

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 

 #!/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 

El $ (…) devolverá el resultado del command, no el valor del nivel de error. Use sin sustitución de command para get el código de retorno adecuado.

Para search una cadena 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 la salida de grep (solo está interesado en el estado de devolución). -x requiere que toda la línea coincida. -F busca una cadena literal en lugar de una expresión regular. -e es una precaución en caso de que $line comience con a - .

Puede tener mejor suerte con la function de index awk : es un equivalente de strstr , por lo que debería ser adecuado para la comparación (en comparación con grep que es para la coincidencia de patrones).

Puedes hacer esto con sed. El problema es que necesita include la cadena en el código dos veces. Una vez para probarlo, nuevamente para insertlo.

 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