Remover certos caracteres em um arquivo de texto

0

Eu tenho um arquivo de texto; seu conteúdo é como abaixo.

$ cat file.txt
[] [1]foo1 bar1
[] [2]foo2 bar2
[] [35]foo3 bar3
[] [445]foo4 bar4
[] [87898]foo5 bar5

Eu posso remover com êxito a primeira coluna usando awk, mas não consigo remover caracteres [num], pois eles estão associados à string.

Estou tentando obter uma saída como abaixo

$ cat file.txt
foo1 bar1 
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
    
por smc 16.04.2018 / 16:13

5 respostas

5
$ sed 's/.*]//' file.txt | tr -s ' '
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

O sed remove tudo na linha até (e incluindo) o% final] e o tr compacta vários espaços consecutivos em espaços únicos.

Como alternativa, usando apenas sed :

sed -e 's/.*]//' -e 's/  */ /g' file.txt

Com os dados de entrada fornecidos, isso produz a mesma saída que o primeiro pipeline.

Este sed primeiro faz s/.*]// , o que exclui tudo até o ] (inclusive). A segunda expressão corresponde a ␣␣* , ou seja, um espaço seguido por zero ou mais espaços e os substitui por um único espaço. A segunda expressão é aplicada em toda a linha e tem o mesmo efeito que tr -s ' ' , ou seja, comprime vários espaços consecutivos em espaços únicos.

Usando awk :

awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt

Aqui, usamos ] ou espaços ou tabulações como separadores de campo (múltiplos deles podem separar duas colunas, e é por isso que usamos * após o [...] ). Dados esses separadores, os dados desejados estão disponíveis nos campos 3 e 4 em cada linha.

Após os dados da pergunta terem sido editados para remover alguns espaços entre as duas últimas colunas, o seguinte também fará o trabalho:

cut -d ']' -f 3 file.txt

alternativamente apenas

sed 's/.*]//' file.txt

ou

awk -F ']' '{ print $3 }' file.txt
    
por 16.04.2018 / 16:20
1

Você pode usar sed

$ sed -e 's/.*]//g' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

Você pode usar o 'awk

$ awk -F'.*]' '{print $2}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
    
por 16.04.2018 / 16:30
0

Usando o awk:

$ awk '{$2=substr($2,index($2,"]")+1);print $2,$3}' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

O segundo parâmetro $2 é truncado usando substr do primeiro ] encontrado. Os parâmetros 2 e 3 são então impressos.

    
por 16.04.2018 / 16:24
0

Com corte

cut -d ] -f3 file.txt
    
por 16.04.2018 / 20:06
0

Outra proposta do awk

awk '{gsub(/\[.+foo|\]/,"foo")}1' file
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5
    
por 16.04.2018 / 20:44