2012-05-23 4 views

ответ

3

Это звучит, как вы пытаетесь разобрать XML с регулярными выражениями, которые, как правило, плохая идея — XML является гораздо более сложным, чем это может показаться вначале (что происходит, когда вам нужно заменить <a b="c"/> на <a b="c"></a>? ? Как насчет имен элементов не-ASCII) — но если вы уверены, что вы описали это именно то, что вам нужно, то вы можете написать:

perl -pe 's{<(\w+)/>}{<$1></$1>}g' <input_file> output_file 

или:

sed 's|<\([^[:space:]][^[:space:]]*\)/>|<\1></\1>|g' <input_file> output_file 
+0

Благодарим вас от версии sed. Я только удалил '[: space:]' check ... также я уверен, что файл, который мне нужно отредактировать, имеет только значение «» или «» ' теги ... – Marcx

0

Регулярное выражение чтобы соответствовать вашим тегам:

<(\w+)/> 

Используя колпачок ры группы, вы можете создать новые теги, как это:

<\1></\1> 
0

Этот может работать для вас:

echo '<book/>' | sed 's|<\([^/]*\)/>|<\1></\1>|' 
<book></book> 
+0

спасибо! но мне это не нужно для определенного слова .. :) – Marcx

+0

Я не понимаю. Это работает с любым тегом, а не только с буквой. – potong

1

Использование

sed -i 's|<\([[:alpha:]][[:alpha:]]*\)/>|<\1></\1>|g' $input_file 

Чтобы изменить файл в строке (это то, что для -i). Осторожно: -i является расширением GNU.

Чтобы быть POSIX совместимых и редактировать файл инлайн (в любой системе IX *), используйте:

echo '/<[[:alpha:]][[:alpha:]]*\/>/g\ 
s/<\([[:alpha:]][[:alpha:]]*\)\/>/<\1><\/\1>/g 
wq' | ed $input_file 

См стандарт POSIX на sed, ed и regular expressions.

Смежные вопросы