usa sed para substituir uma string específica por barras

1

Eu tenho um grande arquivo de texto - um arquivo de registro do windows - com cerca de 5,5MB e tenho que remover uma string "serv \ b \ Param \". Abrir com gedit ou nano não funciona. Ele vai consumir 100% do tempo de CPU por algum tempo longo irracional ou apenas imprimirá lixo aleatório de texto. Eu tentei usar esses comandos do Linux porque não posso usar o outro:

sed -i 's|"serv\b\Param"|""|g' ~/Desktop/3.reg

sed -i 's|\"serv\b\Param"|\""|g' ~/Desktop/3.reg

sed -i 's:serv\b\Param:"":g' ~/Desktop/3.reg

sed -i 's:serv\b\Param::g' ~/Desktop/3.reg

sed -i 's:"serv\b\Param":"":g' ~/Desktop/3.reg

Nada funciona até agora. O que há de errado com esses comandos?

    
por user128712 06.11.2014 / 01:20

2 respostas

0

O problema básico é que \ introduz várias sequências em expressões regulares, portanto, para corresponder \ no fluxo de entrada, você precisa usar \ no RE.

Não está claro se as aspas fazem parte da string que você deseja remover: do seu quarto exemplo, eu diria que não, neste caso, este exemplo funciona se você dobrar as barras invertidas:

sed -i 's:serv\b\Param::g' ~/Desktop/3.reg

Você não precisa de aspas duplas nas strings de pesquisa ou de substituição, a menos que elas façam parte dos critérios de pesquisa: aspas simples ao redor da expressão de edição já removem quaisquer significados especiais no que diz respeito ao shell, portanto sed vê a expressão literal.

    
por 06.11.2014 / 02:03
0

As barras precisam ser ignoradas:

sed -i 's|serv\b\Param\||g' ~/Desktop/3.reg

Em sed , uma única barra invertida geralmente é um caractere de escape para algo. Por exemplo, no GNU sed , um escape-b, como em \b , é interpretado como significando um limite de palavra. Para evitar essa interpretação, coloque duas barras invertidas seguidas, onde quer que você queira combinar uma única barra invertida literal.

Exemplo

Com base no seu exemplo (atualizado de acordo com os comentários), vamos começar com este arquivo:

$ cat 3.reg
serv\b\Param\
abc serv\b\Param\ def

Aplicando o comando sed acima:

$ sed -i 's|serv\b\Param\||g' 3.reg
$ cat 3.reg

abc  def

O padrão é removido com sucesso.

    
por 06.11.2014 / 02:02

Tags