Tentando limpar arquivos de log em uma máquina Linux, atualmente usando sed

1

Eu tenho uma quantidade grande de arquivos de log dos quais preciso remover dados confidenciais. Os dados confidenciais são fornecidos para mim em um arquivo de texto e tendem a mudar.

Eu esperava fazer o equivalente a isso:

#!/usr/bin/bash
pattern=""
for val in 'sed -e 's/.*=//' Client_clean.txt
do
      pattern=$pattern$val"|"
done
#egrep -e $pattern $1
sed -i 's/$pattern/CLIENT/g' $1
exit 0

O egrep com comentários funciona bem, o sed não.

Estou certo em usar sed para isso? Ou há um caminho mais adequado para se tomar?

Qualquer ajuda apreciada.

Steve

    
por Steve 21.02.2011 / 19:13

2 respostas

2

Para poder expandir uma variável shell no comando sed , você precisa usar aspas duplas.

Você precisa usar a opção -r como sed ou preceder os caracteres de barra com barras invertidas.

Você também precisa evitar adicionar um caractere de pipe no final. Se você tiver, cordas vazias serão combinadas.

#!/usr/bin/bash
pattern=""
delim=""
for val in 'sed -e 's/.*=//' Client_clean.txt
do
      pattern=$pattern$delim$val
      # setting delim after its first use and using it before the new value
      # results in "foo|bar|baz" instead of "foo|bar|baz|"
      delim='|'
done
sed -ri "s/$pattern/CLIENT/g" "$1"
    
por 21.02.2011 / 19:42
1

Sim, sed é o caminho a percorrer.

O que eu vejo de errado no seu comando sed são as citações. o padrão $ não será substituído pelo seu conteúdo se você usar 'para citar. Em vez de usar "você deveria usar":

sed -ri "s/$pattern/CLIENT/g" $1

Você também precisa de "-r" para expressões regulares estendidas.

E padrão = $ pattern $ val "|" provavelmente deveria ser

pattern=$pattern"|"$val
    
por 21.02.2011 / 19:40