¿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 awk
solución si la tuya admite la -i inplace
opció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 awk
que haga los cambios -i inplace
y 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==country
esa es la primera parte del partido.
Para la empresa, verifique si dividió \
y terminó con varios campos NR>1
o 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>1
entonces 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