combine 2 sed sem salvar as alterações no arquivo

combine 2 sed sem salvar as alterações no arquivo

É 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 awksolução se a sua suportar a -i inplaceopçã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 awkpara fazer as alterações -i inplacee 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==countryfor a primeira parte da partida.

Para a empresa, verifique se você dividiu \e acabou com vários campos NR>1ou 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

informação relacionada