¿Cómo hacer sed o usar otro comando para reimprimir una cadena encontrada?

¿Cómo hacer sed o usar otro comando para reimprimir una cadena encontrada?

Tengo una cadena como:testfsdfsdftestfsdkflsdtestsdfsdfsdf

Me pregunto cómo separar la cadena para que testfsdfsdfaparezca en la primera línea, testfsdkflsdaparezca en la segunda línea, etc., así:

testfsdfsdf
testfsdkflsd
testsdfsdfsdf

Intenté usar sedto find testy cualquier cosa después, sed 's/test.*/pero me pregunto cómo reimprimir test.*nuevamente. Por lo que sé sed, puedes usarlo para encontrar una cadena en particular y luego reemplazarla con otra cosa. Básicamente, quería probar algo como sed 's/test.*/[reprint test.* here]\n/g', pero si lo hago sed 's/test.*/test.*\n/g', simplemente genera test.*. ¿Hay alguna forma de reimprimir la cadena encontrada con sedo puedo hacerlo con otro comando?

También probé sed 's/\(test.*\)test/\1\ntest/g', que funciona si solo hay dos instancias de test[random characters], pero no tres o más. Con la cadena testfsdfsdftestfsdkflsdtestsdfsdfsdf, solo imprime:

testfsdfsdftestfsdkflsd
testsdfsdfsdf

Respuesta1

Estás cerca. El comando sed que deseas es

sed 's/test/\ntest/g'

Antepone un carácter de nueva línea a cada uno test.

Ahora bien, aunque GNU sed y posiblemente otros lo hagan, la interpretación de \ncomo una nueva línea no está especificada porPOSIX. Para que el comando sea portátil, se requiere una nueva línea literal con carácter de escape,

sed 's/test/\
test/g'

Sin embargo, notará que si testson los primeros cuatro caracteres de la línea, como es el caso de su ejemplo, se creará una línea vacía al comienzo de la salida. Si eso no sucede, podemos usar

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

.coincide con cualquier carácter, por lo que la existencia de algún carácter antes testesrequerido; de lo contrario, la expresión regular no coincide. Es decir, si testes la primera cadena de la línea, entonces .no puede coincidir con nada y no se realiza la sustitución.

Y para la alternativa portátil,

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

Algunas pruebas con GNU sed:

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

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

También probé sed 's/\(test.*\)test/\1\ntest/g', que funciona si solo hay dos instancias de test, pero no tres o más.

Eso es porque .*es codicioso, es decir, igualará todo lo que pueda. Por ejemplo,

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

Colores/combina con todo, desde el primero hasta elúltimo b.

información relacionada