GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Cómo guardar el patrón coincidente en una variable usando el comando 'sed'?

Estoy tratando de encontrar un patrón usando sed comando en file.txt entre el primer char1 y char2 y luego reemplázalo con una cadena. como abajo con echo ejemplo de modo:

echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'

También necesito guardar el patrón coincidente (como is test {<–los espacios alrededor son importantes}) en una variable.

Respuesta aceptada:

Aquí hay una única invocación de sed que escribe la línea revisada en stdout y al mismo tiempo guarda el texto eliminado en la variable de shell var :

$ var=$(echo "This X is test Y. But X is not test Y." | sed -nr 'h;s/[^X]*X([^Y]*)Y.*/\1/;p;x;s/X[^Y]*Y/REPLACE/;w /dev/stderr') 2>&1
This REPLACE. But X is not test Y.

El valor de var es:

$ echo "==$var=="
== is test ==

Explicación:

  • h

    Este comando copia el patrón actual en el espacio de espera.

  • s/[^X]*X([^Y]*)Y.*/\1/;p

    Esto elimina todo del espacio del patrón excepto el texto entre la primera X y Y incluyendo cualquier espacio. Esto luego se imprime en la salida estándar. Esta es la salida capturada por el shell y asignada a var .

  • x

    Esto copia el espacio de espera de vuelta al espacio patrón. Cuando se hace esto, el espacio del patrón contiene una copia de la línea de entrada original.

  • s/X[^Y]*Y/REPLACE/; w /dev/stderr

    Se realiza la sustitución y el resultado se escribe en stderr .

  • 2>&1

    Después de que el shell haya capturado la salida estándar en var , esto le indica al shell que copie stderr (que tiene la línea con REPLACE) a stdout.

Aparte del manejo de la variable var

La variable var incluye los espacios iniciales y finales. Si el shell sometiera posteriormente a var a la división de palabras, estos espacios serían eliminados. Para evitar eso, cuando var se hace referencia, hágalo entre comillas dobles, como en el ejemplo anterior.


Ubuntu
  1. Cómo asignar la salida de un comando de Linux a una variable

  2. Cómo guardar la salida del comando en un archivo en Linux

  3. ¿Cómo ejecutamos un comando almacenado en una variable?

  4. ¿Cómo iniciar Anydesk en Ubuntu usando el símbolo del sistema?

  5. Cómo reiniciar Linux usando la línea de comandos

Cómo reiniciar Debian usando la línea de comandos

Cómo crear un archivo en Linux usando Terminal

Cómo crear un archivo en Ubuntu Linux usando comando y GUI

Cómo actualizar Ubuntu 16.04 LTS a 20.04 LTS usando la terminal de comandos

Cómo copiar archivos en Linux usando el comando CP

Cómo usar el comando nmap