Remoção de multi-diretório multi-arquivo de ^ @

1

Eu tenho vários arquivos em vários subdiretórios, onde eu preciso remover todas as instâncias do caractere de controle "^ @". Apenas um grep básico não parece estar funcionando. Isso que eu tentei mais recentemente.

 grep -rl '\^@' ./ | xargs sed -i 's/[\^@]//g' 

Alguma sugestão?

    
por Bryan 09.10.2018 / 17:36

2 respostas

4

^@ é geralmente uma representação do caractere NUL (valor de byte 0).

Muitos utilitários de texto não-GNU não podem lidar com isso, pois não foram encontrados em texto.

Algumas versões do GNU grep podem encontrá-lo com:

grep -P '
grep -rlZP '
find . -type f -exec gawk -vORS='
grep -P '
grep -rlZP '
find . -type f -exec gawk -vORS='%pre%' '
  /%pre%/{print FILENAME; nextfile}' {} + |
  xargs -r0 sed -i 's/\x0//g'
' . | xargs -r0 sed -i 's/\x0//g'
'
' ' /%pre%/{print FILENAME; nextfile}' {} + | xargs -r0 sed -i 's/\x0//g'
' . | xargs -r0 sed -i 's/\x0//g'
'

O GNU sed pode removê-lo com sed 's/\x0//g' , então:

%pre%

Se o seu grep não os encontrar, experimente o GNU awk :

%pre%     
por 09.10.2018 / 17:53
0

^@ é como o byte NUL (valor numérico 0 ) é frequentemente representado, por exemplo

$ printf "null
$ sed -e 's/\x00//g' nullbyte  |cat -A
nullbyte$
0byte\n" > nullbyte $ cat -A nullbyte null^@byte$

Um problema ao lidar com isso é que você não pode passar literalmente na linha de comando. É simplesmente impossível, já que o mesmo byte é usado para finalizar os argumentos da linha de comando. Em vez disso, você terá que escapar de alguma forma (e \^@ não funcionará.)

Expressões regulares como suportadas pelo GNU grep no meu sistema não parecem fornecer uma maneira de lidar com isso. Por outro lado, o GNU sed parece entender \x00 , então isso funciona para removê-lo:

$ tr -d '
$ printf "null
$ sed -e 's/\x00//g' nullbyte  |cat -A
nullbyte$
0byte\n" > nullbyte $ cat -A nullbyte null^@byte$
0' < nullbyte | cat -A nullbyte$

tr também deve funcionar, embora não tenha -i :

$ tr -d '%pre%0' < nullbyte  | cat -A
nullbyte$
    
por 09.10.2018 / 17:53