combine 2 sed sin guardar los cambios en el archivo

combine 2 sed sin guardar los cambios en el archivo

¿Es posible eliminar símbolos especiales como \ de un archivo mientras se lee y busca en un archivo de palabras con sed y una línea de comentario que consta de palabras y luego se guarda, pero \ estará en su lugar?

Quiero decir, tengo un archivo con nombres de empresas (2 palabras) y entre ellos pueden haber algunos caracteres y en el archivo original utilicé caracteres de escape (regex) para esos símbolos. Por ejemplo

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\_M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\.M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

Sustituyo \ por nada y comento, pero también quiero guardar con \ como antes. Salida que me gustaría tener:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

Mi guión es:

sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt

Pero se guarda sin \. Sí, sé que puedo, no eliminar y simplemente buscar como Red\\\\ Park. Sin embargo, si tengo 20 nombres, no me gustaría escribir \\\\ para cada nombre de empresa que consta de 2 o 3 palabras :) ¿O tal vez tengas otra visión para hacerlo con otro comando, no sed? Estoy abierto a cualquier consejo o ayuda. ¿Es posible conseguir lo que quiero? ¡Muchas gracias!

Respuesta1

Si te entiendo bien, veamos si esto te funciona:

sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file

Producción:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

Respuesta2

Dicen que la perseverancia es una virtud...

Supongo que los 2 nombres de las empresas están separados por \\un carácter más y que los países siempre están en mayúsculas y que todas las empresas contienen al menos una minúscula, es decir, una empresa no puede ser una subcadena de un país.

Una awksolución si la tuya admite la -i inplaceopción; creo que la mayoría lo hace

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
    OFS="\\"}
    $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}
    NF>1{$NF=" "substr($NF,2)
    };1' file1
Output

#lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"

Tutorial

Dígale awkque haga los cambios -i inplacey pase su país y empresa como variables -v. Dado que tiene un separador desconocido \\en su archivo, utilícelo .entre las dos partes del nombre de la empresa.

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{

configure el separador de campos para que se rompa, \lo que le dará 3 campos donde \\ocurre y luego configure

        OFS="\\"} 

para volver a colocarlos cuando imprima si hubo una interrupción.

Si es el primer campo $1==countryesa es la primera parte del partido.

Para la empresa, verifique si dividió \y terminó con varios campos NR>1o no y luego pruebe con los últimos 2 campos o con el campo no dividido, según corresponda.

Si tenemos una coincidencia entonces printf #(eso se imprime sin una nueva línea)

        $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}

Si tiene más de 1 campo, NF>1entonces lo divide \\?entre nombres de empresas y desea asegurarse de que ?haya espacios en blanco cuando lo imprima, así que elimine el primer carácter del último campo y reemplácelo con un espacio.

    NF>1{$NF=" "substr($NF,2)

e imprimir

;1' file1

información relacionada