como obter texto com sed?

3

Eu quero pegar o texto entre tok98 e 5678 e despejar isso em um arquivo.

se o tok98 e o 5678 estiverem na mesma linha, eu posso usar isso

sed -n 's/.*\(tok98\)\(.*\)\(5678\).*//p' testfile.txt > text.dmp

mas quando os tokens são espaçados verticalmente não funciona, como posso reescrever este sed para funcionar aqui

$ cat testfile.txt
do with > 9
tok98
  fdf  df s df sd f sd v
  dvsdv  dvf sd vs vs dv  sdfsd

    2323 2323  232 {}   
   sfdf sd  f s df s df  sf 
5678
no way = true + 50

$
    
por Darkmage 31.01.2012 / 12:51

2 respostas

6

Você pode usar / START /, / STOP / intervalos de padrões em sed

sed -n '/tok98/,/5678/p' file

/ START / e / STOP / também podem ser REs

sed -n '/^tok98/,/^5678/p' file

seria impresso entre as linhas, iniciando tok98 e 5678 e não iniciaria ou pararia a menos que as linhas começassem com essas cadeias.

Se você quiser excluir o / START / / / / STOP / então isso deve funcionar

sed -n '/^tok98/,/^5678/ {/^tok98/b;/^5678/b;p}' file
    
por 31.01.2012 / 13:14
5

sed por padrão não processa várias linhas, mas isso pode ser resolvido usando um truque como:

$ cat testfile.txt | tr '\n' ',' | sed -n 's/.*\(tok98\)\(.*\)\(5678\).*//p' | tr ',' '\n' > text.dmp

Você só precisa converter as novas linhas de caracteres \n em outro caractere como , e convertê-las novamente para \ n quando terminar com sed . Você precisa ter certeza de que o arquivo de entrada não tem vírgula.

    
por 31.01.2012 / 13:00

Tags