sed 's:data of type samplex:\n:g' File_name -i
Este código substituirá a dita string por nova linha, para que você obtenha as informações necessárias. Use a opção -i
para salvar as alterações apenas no arquivo original.
Como pode extrair as linhas entre dois padrões que não são exclusivos?
Exemplo: -
data of type samplex
name a
property b
data of type samplex
name c
property d
data of type samplex
name e
property f
data of type sampley
name g
property h
Eu quero pesquisar entre o padrão "data of type samplex" e obter todas as ocorrências das linhas entre eles.
First occurrence:-
name a
property b
Second occurrence:-
name c
property d
Third occurrence:-
name e
property f
Para obter a primeira ocorrência sozinha e quando os dois padrões são diferentes,
sed '/pattern1/,/pattern2/p;/pattern2/q' <file> will work.
Como posso ajustar esse comando para minha exigência?
sed 's:data of type samplex:\n:g' File_name -i
Este código substituirá a dita string por nova linha, para que você obtenha as informações necessárias. Use a opção -i
para salvar as alterações apenas no arquivo original.
Isso funciona para você?
grep "data of type samplex" -A 2 <file>
Com base na minha interpretação possivelmente errada do que você quer ... Obviamente, você poderia encurtá-la se puder corresponder menos do que a frase inteira.
sed -n '/data\ of\ type\ samplex/,/data\ of\ type\ sampley/{s/data\ of\ type\ sample[xy]//; p}' file
-n
quiet, não imprima nada até que a saída e [xy]
corresponda x ou y aqui
s/data\ of\ type\ sample[xy]//
exclua o padrão correspondente deixando uma linha vazia
p
print o que resta depois de tudo isso
Saída:
name a
property b
name c
property d
name e
property f
Eu ainda não descobri como adicionar uma "Nth ocorrência:" no caso de você querer isso
Suposição:
data of type
seguidas por palavras-chave como samplex
, sampley
, etc O arquivo de entrada foi modificado para refletir os casos de canto
$ cat ip.txt
data of type samplex
name a
property b
data of type samplez
name 1
property 2
data of type samplex
name e
property f
data of type sampley
name g
property h
data of type samplex
name c
property d
Na solução abaixo, $match
é definido como 1
se a seção corresponder, senão 0
quando a linha de entrada for data of type
. Em seguida, as linhas de entrada são impressas até a próxima seção começar. Desta forma, uma seção no final do arquivo também é cuidada.
$ perl -ne 'if(/data of type /){$match=/samplex$/} elsif($match){print}' ip.txt
name a
property b
name e
property f
name c
property d
$ perl -ne 'if(/data of type /){$match=/samplez$/} elsif($match){print}' ip.txt
name 1
property 2
$ perl -ne 'if(/data of type /){$match=/sampley$/} elsif($match){print}' ip.txt
name g
property h
Tags awk sed regular-expression