Usando grep
com PCRE [ -P
] e modificador Dotall [ (?s)
]:
1ª parte:
$ grep -Poz "(?s)^.*?(?=\nsegsites:)" file.txt
//
[297]((((21:0.125204,20:0.125204):0.00994299,(28:0.0790047,(7:0.0146105,5:0.0146105):0.0643943):0.0561423):0
2ª parte:
$ grep -Poz "(?s)segsites.*?(?=\n[10]+$)" file.txt
segsites:
positions: 1 2 4 6 9 10 45 67 78 89
No caso da terceira parte, apenas grep
será (se você tiver apenas uma linha):
$ grep -E "^[01]+$" file.txt
01010101010101010101010101011111010101
Se você não tiver certeza (linhas únicas / múltiplas):
$ grep -Poz "(?<=\n)(?:[10]|\n)*(?=\n$)" file.txt
010101010101010101010101010111110101011
01010101010101010101010101011111010101010
$ grep -Poz "(?<=\n)(?:[10]|\n)*(?=\n$)" file.txt
010101010101010101010101010111110101011
Explicações:
-
grep -P
representa PCRE (expressões regulares compatíveis com Perl)
-
grep -o
selecionará apenas a parte correspondente
-
grep -z
fará com que as linhas sejam separadas por ASCII NUL em vez de novas linhas
-
(?s)
é chamado de modificador Dotall, usando esse caractere (incluindo quebras de linha) pode ser correspondido por .
-
(?=)
is Positivo lookahead, representa o que segue a nossa correspondência
-
(?<)
é lookbehind positivo representa o que precede nossa correspondência