Busque una cadena/patrón en el texto seleccionado en BASH

Busque una cadena/patrón en el texto seleccionado en BASH

Quiero descifrar el texto seleccionado si la cadena "-----BEGIN PGP MESSAGE-----" aparece en el texto seleccionado. Tengo el siguiente código pero no me muestra nada.

#!/bin/bash
xsel > pgp.txt
if [grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt]
then
gnome-terminal --command "gpg -d -o decrypted.txt pgp.txt"
gedit decrypted.txt
fi

Cuando lo ejecuto en la terminal después de seleccionar un texto, dice

line 3: [grep: command not found

Soy nuevo en las secuencias de comandos bash. Cualquier ayuda sería apreciada.
Gracias

Respuesta1

Confusamente, [es en realidad un programa, también se lo conoce comoprueba (1). No es necesario incluir el comando grep en un archivo [. Si ibas a utilizar [para algo necesitas separar el corchete izquierdo con un carácter de espacio.[ foo == bar ]

La sintaxis if es:help if

if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

The `if COMMANDS' list is executed.  If its exit status is zero, then the
`then COMMANDS' list is executed. 

El comando que desea probablemente sea más parecido a este.

if grep -q -e "-----BEGIN PGP MESSAGE-----" pgp.txt; then
   ...
   ...
fi

Respuesta2

Debería haber un espacio después de [. Y grep devuelve cadenas para que su prueba pueda fallar. Será mejor que verifiques el estado de salida de grep.

grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
exitcode=$?
if [ $exitcode ]
then
   # not found
else
   # found 
fi

Respuesta3

[Es un comando, no una sintaxis. Es equivalente al testcomando.

Retire los corchetes para ver si funciona:

#!/bin/bash
xsel > pgp.txt
if grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
then
    gnome-terminal --command "gpg -d -o decrypted.txt pgp.txt"
    gedit decrypted.txt
fi

ACTUALIZAR:

Insertar un espacio después del corchete izquierdo tampoco funciona en su caso:

if [ grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt ]
then

porque bash lo expande como:

if test grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt
then

y obtendrás el line 3: [: too many argumentserror.

Recuerda que [es un comando. Se necesitan argumentos y procedimientos y un código de salida.

También puedes descartar la salida estándar de grepusando:

if grep -e "-----BEGIN PGP MESSAGE-----" pgp.txt >/dev/null
then

información relacionada