Как я могу проверить большое количество файлов с поиском и заменой? - PullRequest
4 голосов
/ 28 октября 2008

В настоящее время я проверяю HTML-код клиента и получаю много ошибок проверки для изображений и входных файлов, которые не имеют Omittag. Я бы сделал это вручную, но у этого клиента буквально тысячи файлов, причем во многих случаях это не так.

Этот клиент проверил некоторые теги img (по любой причине).

Просто интересно, есть ли команда unix, которую я мог бы запустить, чтобы проверить, не существует ли Omittag для ее добавления.

Я выполнил простой поиск и заменил его следующей командой:

find . \! -path '*.svn*' -type f -exec sed -i -n '1h;1!H;${;g;s/<b>/<strong>/g;p}' {} \; 

Но никогда не бывает такого большого. Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 28 октября 2008

Попробуй это. Он проверит ваши файлы, сделает резервную копию .orig каждого файла (оператор perl's -i) и заменит теги <img> и <input> на <img /> и <input >.

find . \! -path '*.svn*' -type f -exec perl -pi.orig -e 's{ ( <(?:img|input)\b ([^>]*?) ) \ ?/?> }{$1\ />}sgxi' {} \;

С учетом ввода:

<img>  <img/>  <img src="..">  <img src="" >
<input>  <input/>  <input id="..">  <input id="" >

Изменяет файл на:

<img />  <img />  <img src=".." />  <img src="" />
<input />  <input />  <input id=".." />  <input id="" />

Вот что делает регулярное выражение:

s{(<(?:img|input)\b ([^>]*?)) # capture "<img" or "<input" followed by non-">" chars
  \ ?/?>}                     # optional space, optional slash, followed by ">"
{$1\ />}sgxi                  # replace with: captured text, plus " />"
0 голосов
/ 28 октября 2008

См. Вопросы, которые я задал в комментарии вверху.

Предполагается, что вы используете 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 и устанавливает любые нужные вам опции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...