Agregar línea después del campo de texto

Agregar línea después del campo de texto

¿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 sedel comando "s", como en

sed 's/foo/bar/g'

que reemplaza todas las apariciones de foocon 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'
  • sEl 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 argumento gal final de su /select/replace/g, es decir, reemplace todo lo que encuentre, por ejemplo, reemplace todo<
  • \nargumento 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 \nsecuencia de escape en el texto de reemplazo:

sed 's/</\
</g' file

Esto se ve un poco feo, pero el estándar sedsimplemente no reconoce \nnada más que "un ncará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 xmlstarleto xqen el archivo XML original, tal como se veía antes de comenzar a intentar reformatearlo para analizarlo utilizando herramientas orientadas a líneas.

información relacionada