См. Вопросы, которые я задал в комментарии вверху.
Предполагается, что вы используете GNU sed, и что вы пытаетесь добавить завершающий /
к вашим тегам, чтобы сделать XML-совместимыми <img />
и <input />
, а затем заменить sed выражение в вашей команде с этим, и он должен сделать трюк: '1h;1!H;${;g;s/\(img\|input\)\( [^>]*[^/]\)>/\1\2\/>/g;p;}'
Вот он на простом тестовом файле (колоризатор SO делает дурацкие вещи):
$ cat test.html
This is an <img tag> without closing slash.
Here is an <img tag /> with closing slash.
This is an <input tag > without closing slash.
And here one <input attrib="1"
> that spans multiple lines.
Finally one <input
attrib="1" /> with closing slash.
$ sed -n '1h;1!H;${;g;s/\(img\|input\)\( [^>]*[^/]\)>/\1\2\/>/g;p;}' test.html
This is an <img tag/> without closing slash.
Here is an <img tag /> with closing slash.
This is an <input tag /> without closing slash.
And here one <input attrib="1"
/> that spans multiple lines.
Finally one <input
attrib="1" /> with closing slash.
Вот синтаксис GNU sed regex и , как работает буферизация для выполнения многострочного поиска / замены .
В качестве альтернативы вы можете использовать что-то вроде Tidy , предназначенное для санации плохого HTML - это то, что я бы сделал, если бы делал что-то более сложное, чем пара простых поисков / замен. Опции Tidy быстро усложняются, поэтому обычно лучше написать скрипт на выбранном вами языке сценариев (Python, Perl), который вызывает libtidy
и устанавливает любые нужные вам опции.