É possível excluir símbolos especiais como \ de um arquivo enquanto lê e pesquisa no arquivo word com sed e linha de comentários que consiste em word e depois salva, mas \ estará no lugar?
Quer dizer, tenho um arquivo com nomes de empresas (2 palavras) e entre eles pode haver alguns caracteres e no arquivo original usei escape de caracteres (regex) para esses símbolos. Por exemplo
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$/"
Eu substituo \ por nada e comento, mas quero salvar com \ também como era antes. Saída que eu gostaria de ter:
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$/"
Meu roteiro é:
sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt
Mas salva sem \. Sim, eu sei que posso, não excluo e apenas pesquiso como Red\\\\ Park. No entanto, se eu tiver 20 nomes, não gostaria de digitar \\\\ para cada nome de empresa que consista de 2 a 3 palavras :) Ou talvez você tenha outra visão de fazer isso com outro comando, não sed? Estou aberto a qualquer conselho ou ajuda. É possível conseguir o que desejo? Muito obrigado!
Responder1
Se bem entendi, vamos ver se isso funciona para você:
sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file
Saída:
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$/"
Responder2
Dizem que persistência é uma virtude......
Estou assumindo que todos os 2 nomes de empresas são separados por \\
mais um caractere e que os países estão sempre em letras maiúsculas e todas as empresas contêm pelo menos uma letra minúscula, ou seja, uma empresa não pode ser uma substring de um país.
Uma awk
solução se a sua suportar a -i inplace
opção; Eu acredito que a maioria faz
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$/"
Passo a passo
Diga awk
para fazer as alterações -i inplace
e passe seu país e empresa como variáveis -v
. Como você tem um separador desconhecido \\
em seu arquivo, use .
entre as duas partes do nome da empresa
awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{
defina o separador de campo para quebrar, \
o que lhe dará 3 campos onde \\
ocorre e então defina
OFS="\\"}
para colocá-los de volta ao imprimir, se houver uma pausa.
Se o primeiro campo $1==country
for a primeira parte da partida.
Para a empresa, verifique se você dividiu \
e acabou com vários campos NR>1
ou não e, em seguida, teste os 2 últimos campos ou o campo não dividido, conforme apropriado.
Se tivermos uma correspondência printf #
(isso é impresso sem nova linha)
$1~country && NR>1?$(NR-2)$NR:$1~company{
printf "#"}
Se você tiver mais de um campo NF>1
, divida entre \\?
os nomes das empresas e queira ter certeza de que ?
há um espaço em branco ao imprimi-lo, então remova o primeiro caractere do último campo e substitua-o por um espaço
NF>1{$NF=" "substr($NF,2)
E imprimir
;1' file1