Tengo una cadena como:testfsdfsdftestfsdkflsdtestsdfsdfsdf
Me pregunto cómo separar la cadena para que testfsdfsdf
aparezca en la primera línea, testfsdkflsd
aparezca en la segunda línea, etc., así:
testfsdfsdf
testfsdkflsd
testsdfsdfsdf
Intenté usar sed
to find test
y 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 sed
o 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 \n
como 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 test
son 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 test
esrequerido; de lo contrario, la expresión regular no coincide. Es decir, si test
es 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 detest
, 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
.