Procura por uma string em uma linha e acrescenta linhas relacionadas

1

Eu tenho um arquivo contendo algumas linhas ID (identifier) e DS (description). Gostaria de manter as linhas contendo o valor string na linha ID , bem como todas as seguintes% (relacionadas) linhasDS antes do seguinte ID . Por exemplo:

ID  number1 string
DS  item11
DS  item12
ID  number2 not_string
DS  item21 
DS  item22
ID  number3 string
DS  item31
DS  item32

retornará:

ID  number1 string
DS  item11
DS  item12
ID  number3 string
DS  item31
DS  item32
    
por dovah 25.07.2014 / 08:48

2 respostas

3

Se bem entendi, altero o not_string em sua entrada para teste:

ID  number1 string                                                              
DS  item11                                                                      
DS  item12                                                                      
ID  number2 qwerty                                                               
DS  item21                                                                      
DS  item22                                                                      
ID  number3 string                                                              
DS  item31                                                                      
DS  item32

Tente:

$ awk '/ID/ && !/string/{flag=0;next};/string/{flag=1};flag' file 
ID  number1 string
DS  item11
DS  item12
ID  number3 string
DS  item31
DS  item32
    
por 25.07.2014 / 09:00
2
sed -n '/ID.* s/p;//,/ID/{//!p;}' <<\DATA                              
    ID  number1 string
    DS  item11
    DS  item12
    ID  number2 not_string
    DS  item21
    DS  item22
    ID  number3 string
    DS  item31
    DS  item32
DATA

Isso depende do comportamento POSIX definido para sed regex address:

If an RE is empty (that is, no pattern is specified) sed shall behave as if the last RE used in the last command applied (either as an /address/ or as part of a s/ubsti/tute/ command) was specified.

Quando a parte superior de sua pesquisa é correspondida pelo endereço /ID.* s/ , ela é p rinted. Um intervalo de linha é especificado entre as linhas que correspondem ao último endereço //,/ID/ e a próxima linha ID . Quaisquer linhas que caiam {within;} desse intervalo (ou uma incompleta se terminar com a última linha) que !not match // também são p rinted.

Tudo o que acontece são as /ID.* s/ lines I explicitamente p rint e todas as linhas que ocorrem entre essa e a próxima /ID/ line - ou (e incluindo) a última linha, o que ocorrer primeiro.

OUTPUT

ID  number1 string
DS  item11
DS  item12
ID  number3 string
DS  item31
DS  item32
    
por 25.07.2014 / 10:59

Tags