Substituir texto especial por sed?

3


Estou usando o CMD no Windows Xp para substituir texto especial por Sed. Estou usando este comando para substituir caracteres especiais como $ or * :

sed -i "s/\*/123/g;" 1.txt

Mas como devo usar o comando para substituir essas cadeias com ciao! em meus arquivos de texto? É possível?

\
\\
""
sed.exe -i "s/{\*)(//123/
sed -i "s/\/123/g;" 1.txt

o comando anterior não funciona porque eu tenho \ , " e outras strings especiais que sed usam para fazer regex.

    
por user143822 07.07.2012 / 17:31

2 respostas

5

Procurando por strings literal com uma expressão regular, quando a string de pesquisa contém caracteres especiais, às vezes não é tão simples quanto procurar padrões, mas você pode fazer isso com um pouco de malabarismo.

Observação: o comando echo deve atender caracteres especiais do CMD, portanto, ele precisa de ^^ para escapar de um único ^ e ^| para escapar de | ... Você não precisa do CMD caractere de escape ^ se você digitar diretamente no arquivo.

Passo 1: Crie um arquivo chamado literal-srch-strings.txt , que contém a string exata (inalterada) a ser substituída. Existem duas maneiras de criar este arquivo:

  1. Como um comando emitido na linha de comando do CMD , ou como um comando em um script de comando .cmd / .bat .

    echo sed -i^^/\*$/$[{" ;"> literal-srch-strings.txt

  2. Crie literal-srch-strings.txt você mesmo, no seu editor de texto.
    Nesse caso, você não deve usar o caractere de escape CMD ^ , portanto, a linha tem apenas um ^ , não ^^ - isso porque você está ignorando o CMD -shell.
    Aqui está o que é necessário no arquivo .txt (assim como o nome do arquivo diz :)

    sed -i^/\*$/$[{" ;"

Passo 2: Crie um script sed , chamado str-to-regex.sed , para converter a (s) string (s) em sed regex (s)

Observe que o mesmo problema do caractere de escape CMD ^ se aplica a essa etapa, então, novamente, há duas maneiras de criar o arquivo .sed:

  1. Como um comando:

    echo s/[]\/$*.^^^|[]/\^&/g; s/.*/s\/^&\/Ciao!\/g/> str-to-regex.sed

  2. Usando seu editor de texto, crie um arquivo chamado str-to-regex.sed , contendo:

    s/[]\/$*.^|[]/\&/g; s/.*/s\/&\/Ciao!\/g/

Etapa 3: Execute o sed-script que converte a string em uma expressão regeular sed e envie sua saída para outro script sed, replace-text.sed , que fará a substituição real.

sed -f str-to-regex.sed  literal-srch-strings.txt > replace-text.sed

Passo 4: Executar replace-text.sed - Para o teste, podemos usar literal-srch-strings.txt como o arquivo de entrada, mas você pode, obviamente, usar qualquer arquivo de entrada.

sed -f replace-text.sed  literal-srch-strings.txt

Aqui está a saída:

Ciao! 
    
por 07.07.2012 / 21:44
0

Para substituir o significado de caracteres especiais na linha de comando (ou linhas em um arquivo de lote), escape-os com o caractere ^ (carat). Para inserir um caractere de quilate literal, use dois deles em uma linha.

    
por 07.07.2012 / 17:40