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 \n
nueva 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 (cadenaEND
vací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
\n
como en la respuesta de @ AB no funcionaría con algunassed
implementaciones.\|
para la alternancia en una expresión regular pero no\n
significa nueva línea en uns
reemplazo?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=$1
causaawk
reconstruir$0
conOFS
como separador de campo1
es un valor verdadero, porqueawk
imprime toda la línea de entradafuente
Otro posiblemente awkcomando y usar su
RS
opció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=$1
con el$0
comando:fuente
$1=$1
condensa 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
sed
eso 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