Как мне добавить новую строку перед 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, вам может потребоваться использовать буквальный символ новой строки вместо \n
escape-последовательности в тексте замены:
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
или xq
XML для исходного XML-файла, который выглядел до того, как вы начали пытаться переформатировать его для анализа с помощью строчно-ориентированных инструментов.