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};'
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.
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]
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