Инструмент для замены пустых элементов на самозакрывающиеся элементы
У меня есть большой файл 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" />