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 sed
o comando "s", como em
sed 's/foo/bar/g'
que substitui todas as ocorrências de foo
por 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'
s
argumento 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 argumentog
no final do seu/select/replace/g
, ou seja, substitua tudo o que encontrar, por exemplo, substitua tudo<
\n
argumento 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 \n
sequência de escape no texto de substituição:
sed 's/</\
</g' file
Isso parece um pouco feio, mas o padrão sed
simplesmente não reconhece \n
nada além de "um n
caractere 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 xmlstarlet
ou xq
no arquivo XML original, da maneira que parecia antes de começar a tentar reformatá-lo para análise usando ferramentas orientadas a linhas.