¿Cómo puedo agregar una nueva línea antes <
de mis datos?
Mi fecha actual parece
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0" <VALUE MAGID="2" MAGNAME="Heal" TYPE="4" <VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7" <VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7" <VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
La salida debe ser
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0"
<VALUE MAGID="2" MAGNAME="Heal" TYPE="4"
<VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7"
<VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7"
<VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
Respuesta1
Para reemplazar patrones de texto, puede usar sed
el comando "s", como en
sed 's/foo/bar/g'
que reemplaza todas las apariciones de foo
con bar
.
Específicamente, para agregar una nueva línea antes de cada <
, puede
echo '<value ... <value ...' | sed 's/</\n</g'
Si no desea que se agregue la nueva línea al principio, puede hacer esto en su lugar:
echo '<value ... <value ...' | sed 's/\(.\)</\1\n</g'
Respuesta2
sed 's/</\n&/g'
s
El argumento le dice a sed que seleccione y reemplace unsanillo[texto]- sed usa este formato
/selectText/ReplaceText/
--> ejemplo,/<//
esto elimina el símbolo<
, solo el primero<
- para seleccionar todo,
<
use el argumentog
al final de su/select/replace/g
, es decir, reemplace todo lo que encuentre, por ejemplo, reemplace todo<
\n
argumento para agregar unnueva líneatiene que escribirse con\
barra invertida&
El argumento le dice a sed que copie y pegue todo.despuéslo que se ha seleccionado, en este caso,<
VALOR...
Respuesta3
Puede hacer lo que sugieren las otras respuestas, si tiene GNU sed
:
sed 's/</\n</g' file
Sin embargo, si no tienes GNU sed
, por ejemplo en macOS o algún otro sistema BSD, es posible que necesites usar una nueva línea literal en lugar de la \n
secuencia de escape en el texto de reemplazo:
sed 's/</\
</g' file
Esto se ve un poco feo, pero el estándar sed
simplemente no reconoce \n
nada más que "un n
carácter literal" en el texto de reemplazo.
Podrías solucionar la fea sintaxis usando el y///
comando para reemplazar todo <
con nuevas líneas (aquí,\n
esreconocido como "nueva línea") y luego vuelva a insertar los <
caracteres:
sed -e 'y/</\n/' -e 's/\n/&</g' file
Para filtrar la primera línea resultante de esto, que estará vacía, canalice tail -n +2
:
$ sed -e 'y/</\n/' -e 's/\n/&</g' file | tail -n +2
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0"
<VALUE MAGID="2" MAGNAME="Heal" TYPE="4"
<VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7"
<VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7"
<VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
... pero lo ideal sería utilizar un analizador XML como xmlstarlet
o xq
en el archivo XML original, tal como se veía antes de comenzar a intentar reformatearlo para analizarlo utilizando herramientas orientadas a líneas.