Adicionar linha após campo de texto

Adicionar linha após campo de texto

Como posso adicionar uma nova linha antes <de meus dados?

Minha data atual 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"

A saída deve 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" 

Responder1

Para substituir padrões de texto, você pode usar sedo comando "s", como em

sed 's/foo/bar/g'

que substitui todas as ocorrências de foopor bar.

Especificamente, para adicionar uma nova linha antes de each <, você poderia

echo '<value ... <value ...' | sed 's/</\n</g'

Se você não gosta que a nova linha seja adicionada logo no início, você pode fazer o seguinte:

echo '<value ... <value ...' | sed 's/\(.\)</\1\n</g'

Responder2

sed 's/</\n&/g'
  • sargumento diz ao sed para selecionar e substituir umétring[texto]
  • sed use este formato /selectText/ReplaceText/-> exemplo, /<//isso remove o símbolo <, apenas o primeiro<
  • para selecionar tudo, <você usa o argumento gno final do seu /select/replace/g, ou seja, substitua tudo o que encontrar, por exemplo, substitua tudo<
  • \nargumento para adicionar umnova linhatem que ser escrito com \barra invertida
  • &argumento diz ao sed para copiar e colar tudodepoiso que foi selecionado, neste caso,< VALOR...

Responder3

Você pode fazer o que as outras respostas sugerem, se tiver GNU sed:

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

No entanto, se você não possui GNU sed, por exemplo, no macOS ou em algum outro sistema BSD, pode ser necessário usar uma nova linha literal no lugar da \nsequência de escape no texto de substituição:

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

Isso parece um pouco feio, mas o padrão sedsimplesmente não reconhece \nnada além de "um ncaractere literal" no texto de substituição.

Você poderia contornar a sintaxe feia usando o y///comando para substituir tudo <por novas linhas (aqui,\n éreconhecido como "nova linha") e reinsira os <caracteres:

sed -e 'y/</\n/' -e 's/\n/&</g' file

Para filtrar a primeira linha resultante disso, que estará vazia, canalize 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"

... mas idealmente, você usaria um analisador XML como xmlstarletou xqno arquivo XML original, da maneira que parecia antes de começar a tentar reformatá-lo para análise usando ferramentas orientadas a linhas.

informação relacionada