Como fazer sed ou usar outro comando para reimprimir uma string encontrada?

Como fazer sed ou usar outro comando para reimprimir uma string encontrada?

Eu tenho uma string como:testfsdfsdftestfsdkflsdtestsdfsdfsdf

Gostaria de saber como separar a string para que testfsdfsdfapareça na primeira linha, testfsdkflsdapareça na segunda linha, etc.

testfsdfsdf
testfsdkflsd
testsdfsdfsdf

Tentei usar sedpara encontrar teste qualquer coisa depois, sed 's/test.*/mas estou me perguntando como reimprimir test.*novamente. Pelo que sei sed, você pode usá-lo para encontrar uma string específica e depois substituí-la por outra coisa. Então, essencialmente, eu queria tentar algo parecido sed 's/test.*/[reprint test.* here]\n/g', mas se o fizer sed 's/test.*/test.*\n/g', apenas resultará test.*. Existe alguma maneira de reimprimir a string encontrada sedou isso pode ser feito com outro comando?

Também tentei sed 's/\(test.*\)test/\1\ntest/g', que funciona se houver apenas duas instâncias de test[random characters], mas não três ou mais. Com a string testfsdfsdftestfsdkflsdtestsdfsdfsdf, ele imprime apenas:

testfsdfsdftestfsdkflsd
testsdfsdfsdf

Responder1

Você está perto. O comando sed que você deseja é

sed 's/test/\ntest/g'

Ele acrescenta um caractere de nova linha a cada um test.

Agora, embora o GNU sed e possivelmente outros façam isso, a interpretação de \ncomo uma nova linha não é especificada porPOSIX. Para tornar o comando portátil, é necessária uma nova linha literal com escape,

sed 's/test/\
test/g'

Você notará, entretanto, que if testsão os primeiros quatro caracteres da linha, como é o caso do seu exemplo, que criará uma linha vazia no início da saída. Se isso não acontecer, podemos usar

sed 's/\(.\)test/\1\ntest/g'

.corresponde a qualquer caractere, então a existência de algum caractere antes testéobrigatório, caso contrário, o regex não corresponde. Ou seja, se testfor a primeira string da linha, então .não poderá corresponder a nada e a substituição não será feita.

E para a alternativa portátil,

sed 's/\(.\)test/\1\
test/g'

Alguns testes com GNU sed:

$ sed 's/test/\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'

testfsdfsdf
testfsdkflsd
testsdfsdfsdf
$ sed 's/\(.\)test/\1\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'
testfsdfsdf
testfsdkflsd
testsdfsdfsdf

Eu também tentei sed 's/\(test.*\)test/\1\ntest/g', que funciona se houver apenas duas instâncias test, mas não três ou mais.

Isso porque .*é ganancioso, ou seja, vai combinar com tudo que puder. Por exemplo,

grep --color=always "b.*b" <<< abcabcabc

colore/combina tudo, do primeiro aodurar b.

informação relacionada