Aquí le mostramos cómo buscar expresiones regulares con sed y resaltar coincidencias o devolver el código de salida (5) si no se encuentra ninguna coincidencia:
Esto es input.txt:
hello there
my dear old friend
a lot of things
we'll pass along the end
Aquí está mi función para imprimir todo + resaltar coincidencias + código de salida de retorno:
highlight()
{
pattern=$1
shift
sed '/'"${pattern}"'/,${s//\x1b[32m&\x1b[0m/g;b};$q5' "$@"
}
$ resaltar "lo \ | end" input.txt || echo -e "\ n * No se encontraron coincidencias *"
hel lo que hay
mis queridos viejos vie terminar
una Mín t de cosas
vamos a pasar una Mín ng del extremo
Cuando no hay coincidencia, devolverá el código de salida (5). Puedes usarlo con gato y pipa | también:
$ cat input.txt | resalte "hot \ | y" || echo -e "\ n * No se encontraron coincidencias *"
hola
mi querido viejo amigo
muchas cosas
pasaremos al final
* No se encontraron coincidencias *
Gracias a https://unix.stackexchange.com/a/405725/43233 - Lo estoy usando + la opción de salir de sed.
sed
ciertamente tiene un estado de salida, simplemente no hace lo que necesita aquí. Si elsed
comando falla, por ejemplo, si intenta ejecutarlo en un archivo al que no tiene acceso de escritura o que no existe,sed
saldrá con un estado de salida que no sea 0. El estado de salida solo indica sised
logró hacer lo que le dijo que hiciera y siecho "foo.bar" | sed 's/pop.*$//'
se ejecutó correctamente. Eliminó todas las líneas conpop
. Que no hubiera tales líneas es irrelevante, el comando aún funcionaba.