Perl
Aqui está um perl one-liner que faz o trabalho:
$ perl -ne 's/^.*[|>]\ //;print' inp.txt
Aminobenzoate
Atrazine
Bacterial
Benzoate
beta-Lactam
Biosynthesis
Caprolactam
Carbapenem
Ou ainda mais curto, como sugerido por Matija Nalis nos comentários
perl -pe 's/^.*[|>]\ //' inp.txt
Basicamente, ele pega e exclui tudo, desde o início da string até |
ou >
e, em seguida, imprime o material.
Sed alternativo com agrupamento
Se você ainda não percebeu, todas as respostas aqui funcionam com a idéia de excluir as informações principais. O que também podemos fazer é grupo o que queremos e substituir toda a linha por isso. O foco não é na informação principal, mas nas coisas que realmente queremos na saída.
Tome por exemplo este sed
$ sed 's/^.*[>|] \(.*$\)//' inp.txt
Aminobenzoate
Atrazine
Bacterial
Benzoate
beta-Lactam
Biosynthesis
Caprolactam
Carbapenem
O que acontece é que o que estiver dentro de \(
e \)
será tratado como um todo e referenciado por
. Esse comando basicamente diz "pegue o que vier depois de >
ou |
mais um espaço e faça como um grupo, e substitua toda a linha pelo que colocamos nesse grupo
.
Python
Embora os scripts python possam ser um pouco mais longos, eles geralmente são mais legíveis e explícitos. Veja o que poderíamos fazer com o script do Python 3:
#!/usr/bin/env python3
import sys
import re
with open(sys.argv[1]) as fd:
for line in fd:
print(re.split("<|>|\|",line.strip())[1].strip())
As principais ideias aqui são as seguintes:
- nós abrimos qualquer arquivo que seja fornecido como argumento de linha de comando
- iteramos sobre cada linha do arquivo
- usando a função
re.split()
, dividimos cada linha em lista usando >
ou |
ou >
como separador.
- Em seguida, extraímos o segundo item (índice
[1]
na lista, porque as listas começam no índice de 0) nessa lista e, usando strip()
function, removemos os espaços em branco inicial e final.
- Todas essas ações de
re.split()
e extração de lista ocorrem dentro da função print()
, portanto, quando todas essas operações estiverem concluídas, obtemos a sequência de saída desejada e prosseguimos para processar a próxima linha
Se quiséssemos, poderíamos sempre enfiar tudo em uma única linha assim:
$ python -c 'import re,sys;print("\n".join([ re.split("<|>|\|",l.strip())[1].strip() for l in sys.stdin]))' < inp.txt
Aminobenzoate
Atrazine
Bacterial
Benzoate
beta-Lactam
Biosynthesis
Caprolactam
Carbapenem
Outras notas secundárias:
- se esta for realmente uma saída
diff
, como a resposta de Ravexina sugere , podemos sempre incluir <
em todas as expressões aqui apresentado adicionando <
em colchetes. Assim teremos:
-
perl -pe 's/^.*[|><]\ //;' inp.txt
-
sed 's/^.*[><|] \(.*$\)//' inp.txt
- A solução Python foi escrita depois que isso se tornou uma consideração, de modo que a solução já inclui
<