Remove padrões da string usando o bash

2

Estou tentando remover alguns padrões de uma string de entrada de arquivo (analisando o arquivo linha por linha). Aqui está uma string de amostra:

1: (10/17 12:49:31.175) - CONSTANT ID1 - CONSTANT ID2: RAW DATA OUT     > [0x00,0xa2,…,0x00] 

E eu quero que a saída seja algo como o seguinte:

(12:49:31.175): RAW DATA OUT : [0x00,0xa2,…,0x00]

Eu tenho tentado usar egrep ou sed , mas sem sorte até agora, continuo recebendo erros ou algum erro de "padrão substituto não terminado". Aqui está e exemplo do que tentei:

echo $line | sed -e 's/.*\s\([0-9]*:[0-9]*:[0-9]*.[0-9]*\)'

Qualquer ajuda seria apreciada. Eu geralmente sou mais de um cara de arquivo de lote em vez de bater no meu Mac OS / X .

EDITAR:

Devo mencionar que estou lendo um arquivo como tal:

while read line
do

Então eu quero realizar qualquer ação em line para cada linha no arquivo.

    
por Chef Pharaoh 21.10.2014 / 18:35

3 respostas

1

Você também pode chamar perl de bash . O -n arg faz um loop para cada linha. -e significa que o script é uma linha.

cat in.txt | perl -ne 's{.*(.*\().*? (.*) -.*(:.*?)\s\s+.*(\[.*)}{$1$2$3 : $4};'
    
por 21.10.2014 / 18:55
0

Isso funciona na sua linha de entrada de exemplo:

 sed 's/.* \([0-9].*)\) .*>/(: RAW DATA OUT:/
 ' <<\DATA
 1: (10/17 12:49:31.175) - CONSTANT ID1 - CONSTANT ID2: RAW DATA OUT     > [0x00,0xa2,…,0x00]
 DATA

Imprime:

(12:49:31.175): RAW DATA OUT : [0x00,0xa2,…,0x00]    
    
por 21.10.2014 / 20:44
0
sed '
  s/^[^(]*//
  s/([^ ]\+ /(/
  s/ - CONSTANT ID//
  s/ \+>/ :/
' <<DATA
1: (10/17 12:49:31.175) - CONSTANT ID: RAW DATA OUT     > [0x00,0xa2,…,0x00]
DATA
(12:49:31.175): RAW DATA OUT : [0x00,0xa2,…,0x00]

As novas linhas no script sed podem ser substituídas por ponto e vírgula, se você preferir

Em um loop de leitura de tempo:

while read line; do
    echo "$line" | sed 's/^[^(]*//; s/([^ ]\+ /(/; s/ - CONSTANT ID//; s/ \+>/ :/'
done < filename
    
por 21.10.2014 / 18:40