Modificaciones línea por línea en Unix

Modificaciones línea por línea en Unix

Estoy buscando una manera de hacer lo siguiente con un archivo delimitado por barras verticales en UNIX, para CADA LÍNEA y no estoy seguro de por dónde empezar:

  1. Busque un carácter en una línea de texto (¿se supone que usa GREP?)
  2. Si lo encuentra, agregue algo de texto al final de esa línea (¿usando SED?)
  3. Si no lo encuentra, busque otro carácter en la misma línea.
  4. Si lo encuentra, agregue texto al final de la línea; de lo contrario, no haga nada.
  5. BUCLE PARA TODAS LAS LÍNEAS DEL ARCHIVO

Cualquier indicador sería apreciada.

Respuesta1

Todo esto es sedtrabajo, no necesitas herramientas adicionales:

Supongamos que desea agregar fooal final de la línea que contiene un fy baral final de las líneas sin fpero con unb

sed '/f/{
  s/$/foo/
  b
  }
/b/s/$/bar/'

Puede "direccionar" líneas con /pattern/, por lo que los siguientes comandos solo se ejecutan si contienen el patrón. Entonces, en el ejemplo, solo las líneas que contienen un fdesencadenan la ejecución del sreemplazo y b(el {}grupo de comandos, por lo que todo lo que está dentro solo se aplica si la dirección coincide. Las bramas hasta el final del script para evitar agregar otra cadena para un coincidente b.

Enfoque diferente sin rama:

sed '/f/s/$/foo/;s/^[^f]*b[^f]*$/&bar/'

Como ejercicio, puedes resolverlo tú mismo con algunos sedconocimientos, utilizándolo man sedsi es necesario.

Respuesta2

Si desea agregar la misma cadena de texto al final de la línea para ambos escenarios (caracteres a buscar: 'X' 'Y'), puede hacerlo de la siguiente manera:

sed -e 's/[XY].*/&__ADDEDTEXT__/' yourfile

Por otro lado, si desea colocar textos separados al final de las líneas dependiendo del carácter, entonces puede hacer:

sed -e '
   /X/s/$/__TEXT1__/; t
   /Y/s/$/__TEXT2__/
' yourfile

Donde utilizamos el tcomando (leer como prueba) para detectar si el s///comando anterior fue exitoso y saltar al final del código sed en la línea actual. Además, tenga en cuenta la sintaxis: /regex/s/// => si una línea comprende la expresión regular, realice la sustitución en la línea.

Respuesta3

Perl también es una herramienta útil que puede hacer todo de una sola vez.

Entonces, con el ejemplo de @Philippos, un programa Perl se vería así (parte de la sintaxis es opcional y se agregó para aclarar):

perl -pe '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file

Esto lee filey genera el resultado. También puedes "editar" el archivo en su lugar usando -pi -een lugar de -pe( -isignifica "en su lugar"), así:

perl -pi -e '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file

Probablemente también haya una manera de hacer esto, awkaunque las pruebas iniciales fallaron (no soy tan competente en AWK), con Ruby (que se ve casi igual, envíame un mensaje si quieres ejemplos) y puede ser divertido en Bash puro.

información relacionada