Exclui tudo que não corresponde a esse padrão 'something.swf' no arquivo txt

1

Pode sed ou awk fazer isso? O que eu quero fazer é apagar tudo que não corresponda a este padrão '(something).swf'

Não precisa ser esses comandos, e eu sou novo. O processamento de texto é feito através do terminal, então prefiro que ele não exiba apenas a saída, mas salve-a em um arquivo de texto.

Exemplo.

Em uma entrada como:

Hey stackoverflow im 23 years old 'lol.swf' and '33.swf'

Deve sair:

'lol.swf'
'33.swf'
    
por user3922897 08.08.2014 / 17:38

3 respostas

4

Eu usaria apenas o grep (aqui assumindo o GNU grep ):

grep -o "'[^']*\.swf'" input.txt > output.txt

Explicação

  • -o imprime apenas a parte correspondente, não a linha inteira.
  • "'[^']*\.swf'" é o padrão a ser correspondido, colocado em " , para que você possa ter ' nele. Ele corresponde a um ' inicial, seguido por [^']* , que é um número indeterminado de caracteres que não são ' , seguido por .swf (NB você tem que escapar do . como \. , pois . tem um significado especial em expressões regulares.
  • input.txt é o arquivo de entrada para ler.
  • > output.txt redirecionará a saída para este arquivo. Se você remover essa parte, poderá visualizar a saída na tela.

Alternativa

Se o GNU grep não estiver instalado, você pode tentar o seguinte (inspirado pela substituição do Terdon ).

tr -d '\n' <input.txt | tr "'" '\n' | head -n -1 | tail -n +2 | grep '.*\.swf$' > output.txt

Explicação

  • tr -d '\n' <input.txt lerá de input.txt e, em seguida, removerá todas as quebras de linha ( \n ).
  • tr "'" '\n' converterá todos os ' em quebras de linha. Isso significa que cada linha foi anteriormente cercada por ' .
  • %código%. No entanto, se o arquivo de texto original começasse com head -n -1 | tail -n +2 ou terminasse com something.swf' , eles estariam em sua própria linha, apesar de terem apenas um 'something.swf , e seriam erroneamente detectados pelo seguinte ' . Se, no entanto, a primeira ou a última string tiver as duas citações corretamente, haverá uma quebra de linha extra no início ou no final nesse estágio. Portanto, esse segmento de código retira a última linha e a primeira linha para corresponder apenas a esse cenário.
  • grep corresponderá às linhas que terminam com grep '\.swf$' .
por 08.08.2014 / 17:52
3

Se o seu grep não der suporte a -o , você poderá usar perl :

perl -lne "print for /'.*?\.swf'/g" < in.txt > out.txt

com sed :

sed -n "/\('[^']*\.swf'\)/{s//\n\n/;s/.*\n\(.*\n\)//;P;D;}"

Qual é o equivalente de:

awk '
  {
    while(match($0, '"/'[^']*\.swf'/"')) {
      print substr($0, RSTART, RLENGTH)
      $0 = substr($0, RSTART+RLENGTH)
    }
  }'

( D in sed faz um loop com a primeira linha do espaço padrão removida).

    
por 08.08.2014 / 18:00
2

Aqui está uma abordagem awk :

$ awk "{for(i=1;i<=NF;i++){if(\$i~/'[^']*.swf'/){print \$i}}}" file
'lol.swf'
'33.swf'

E um não-GNU grep. Basta alterar todos os espaços para novas linhas e usar o% normalgrep:

$ sed 's/ /\n/g' file | grep "'[^']*.swf'"
'lol.swf'
'33.swf'
    
por 08.08.2014 / 18:11