Tengo un archivo de texto con los siguientes datos y cada fila termina con |END|.
T|somthing|something|END|T|something2|something2|END|
Estoy tratando de reemplazar |END|con una \nnueva línea con sed.
sed 's/\|END\|/\n/g' test.txt
Pero está produciendo resultados incorrectos como a continuación:
T
|
s
o
m
e
...
Pero lo que quiero es esto:
T|somthing|something
T|something2|something2
También lo intenté con tr. Tampoco funcionó.

Respuestas:
Utilizar este:
Lo que intentó no funciona porque sed usa expresiones regulares básicas , y su implementación sed tiene un
\|operador que significa "o" (una extensión común a BRE), por lo que lo que escribió reemplaza (cadenaENDvacía o cadena vacía) por una nueva línea.fuente
\n). La pregunta pregunta cómo reemplazar|END|por una nueva línea, no por\n.Lo siguiente funcionó bien para mí:
Tenga en cuenta que acabo de poner una barra invertida seguida de la tecla Intro.
fuente
\ncomo en la respuesta de @ AB no funcionaría con algunassedimplementaciones.\|para la alternancia en una expresión regular pero no\nsignifica nueva línea en unsreemplazo?Puedes usar
awk:-F'\\|END\\|'establecer separador de campo en|END|OFS='\n'establecer el separador de campo de salida en nueva línea$1=$1causaawkreconstruir$0conOFScomo separador de campo1es un valor verdadero, porqueawkimprime toda la línea de entradafuente
Otro posiblemente awkcomando y usar su
RSopción sería:Imprimirá esos registros (basado en awk de R ECORD S eparator) que no están vacías (tiene al menos un campo) para evitar la impresión de líneas vacías.
Probado en esta entrada:
Da este resultado:
Eso borró todas las líneas vacías :) Si desea tener nuevas líneas también, reemplace
$1=$1con el$0comando:fuente
$1=$1condensa secuencias de espacios en blanco en un carácter de espacio y devuelve falso si el primer campo es 0. No tiene sentido. Es posible que deseeawk 1 RS='\\|END\\|'oawk NF RS='\\|END\\|'oawk length RS='\\|END\\|'aquí. Tenga en cuenta que una expresión regular RS requiere gawk o mawkOtra forma con
sedeso no imprime líneas vacías:por ejemplo, entrada:
salida:
Lo mismo con
ed:fuente
Como se menciona aquí por Walter Mundt , podemos lograr esto usando una cadena citada ANSI C
Mira el enlace de arriba para otras alternativas.
También puede usar la siguiente sintaxis, no estoy seguro si funciona en todos los sabores de Unix / Linux
fuente
Tuve el mismo problema en el estricto shell posix. Lo hice en dos pasadas con un char no utilizado.
fuente