Eu tenho uma string como:testfsdfsdftestfsdkflsdtestsdfsdfsdf
Gostaria de saber como separar a string para que testfsdfsdf
apareça na primeira linha, testfsdkflsd
apareça na segunda linha, etc.
testfsdfsdf
testfsdkflsd
testsdfsdfsdf
Tentei usar sed
para encontrar test
e 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 sed
ou 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 \n
como 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 test
sã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 test
for 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ânciastest
, 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
.