Добавить строку после текстового поля

Добавить строку после текстового поля

Как мне добавить новую строку перед a <в мои данные?

Моя текущая дата выглядит так

<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"

Вывод должен быть

<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" 

решение1

Чтобы заменить шаблоны текста, вы можете использовать sedкоманду "s", например:

sed 's/foo/bar/g'

который заменяет все вхождения fooна bar.

В частности, чтобы добавить новую строку перед каждым <, вы можете

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

Если вы не хотите, чтобы новая строка добавлялась в самом начале, вы можете сделать так:

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

решение2

sed 's/</\n&/g'
  • sаргумент говорит sed выбрать и заменитьстринг[текст]
  • sed использует этот формат /selectText/ReplaceText/--> например, /<//это удаляет символ <, только первый<
  • чтобы выбрать все, <используйте аргумент gв конце вашего /select/replace/g, что означает замену всего, что вы найдете, например, заменить все<
  • \nаргумент для добавленияновая линияего нужно писать с \обратной косой чертой
  • &аргумент говорит sed скопировать и вставить всепослечто было выбрано в данном случае,< ЦЕНИТЬ...

решение3

Если у вас есть GNU, вы можете сделать так, как предлагают другие ответы sed:

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

Однако если у вас нет GNU sed, например, на macOS или какой-либо другой системе BSD, вам может потребоваться использовать буквальный символ новой строки вместо \nescape-последовательности в тексте замены:

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

Это выглядит немного некрасиво, но стандарт sedпросто не распознает \nничего, кроме «буквального nсимвола» в замещающем тексте.

Вы можете обойти этот некрасивый синтаксис, используя y///команду замены всего <на новые строки (здесь,\n являетсяраспознается как «новая строка»), а затем повторно вставьте <символы:

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

Чтобы отфильтровать первую полученную строку, которая будет пустой, выполните команду pipe 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"

... но в идеале вам следует использовать XML-анализатор, например, XML xmlstarletили xqXML для исходного XML-файла, который выглядел до того, как вы начали пытаться переформатировать его для анализа с помощью строчно-ориентированных инструментов.

Связанный контент