Инструмент для замены пустых элементов на самозакрывающиеся элементы

У меня есть большой файл XML со многими элементами, как это:

<Foo Bar="Baz">
</Foo >

Я хочу, чтобы они все стали такими:

<Foo Bar="Baz" />

Есть ли инструмент, который сделает это для меня автоматически?

1 ответ

я не смог получитьxmlstarletсжимать элементы описанным вами способом, если только вы не можете перечислить имена элементов, подлежащих обработке. (Это заменяет значение элемента, поэтому вам придется быть осторожным и убедиться, что оно уже пусто.)

Пример

      # Create example source
p() { echo >&2; printf "%s\n%s\n" '<Foo Bar="Baz">' '</Foo >'; }

# Show initial output
p

<Foo Bar="Baz">
</Foo >

# Use xmlstarlet to edit the <Foo/> element
p | xmlstarlet edit --update '//Foo' --value ''

<?xml version="1.0"?>
<Foo Bar="Baz"/>

Однако, если вы не против использоватьsedдля обработки вашего XML-файла (и обратите внимание, что это, как правило, очень плохая идея ), вы можете использовать что-то вроде этого:

      sed -Ez 's#<([[:alnum:]]*)( [^>]+)?>\r?\n[[:space:]]*</\1[[:space:]]*>#<\1\2 />#g'

Вот что он делает. Сначала он ищет шаблон между первой парой#персонажи,([[:alnum:]]*)( [^>]+)?>\r?\n[[:space:]]*</\1[[:space:]]*>

  • ( ... )- сгруппированное выражение, каждое из которых обозначается как , и т. д.
  • [[:alnum:]_]*- ноль или более буквенно-цифровых символов или символов подчеркивания
  • [^>]+?- пробел, за которым следует что-либо, кроме , все это необязательно
  • - буквальный>характер
  • \r?\n[[:space:]]*- `необязательный CR, за которым следует NL, а затем ноль или более пробелов

И если найдено, то заменяет его на<\1\2 />, где\1и\2являются первым и вторым выражениями в квадратных скобках.

Пример

      p | sed -Ez 's#<([[:alnum:]]*)( [^>]+)?>\r?\n[[:space:]]*</\1[[:space:]]*>#<\1\2 />#g'

<Foo Bar="Baz" />
Другие вопросы по тегам