2016-02-10 6 views
0

Я пытаюсь сделать TOC в своем HTML-файле, ища все теги HTML, которые содержат один из трех классов: статья, раздел и подраздел ,egrep: как искать текст, который включает в себя двойные кавычки (окно win7 cmd)

Я использую GNU grep 2.4.2 в окне Windows 7 cmd. Теперь я прочитал по крайней мере 12 страниц из моего поиска Google и попробовал 20+ перестановок моей команды grep. Я пытаюсь найти классы в своем HTML-файле. К счастью, в моем файле HTML есть только один HTML-тег в строке в файле HTML, что упрощает работу.

Я сделал командный файл cmd и попытался запустить его и получил различные ошибки. Я попытался избежать двойных кавычек и не ускользнуть от них. Я попытался убежать от парнеров и не ускользнуть от них. Я пробовал разные ключи с и без -E и т. Д. Это регулярное выражение, которое мне нужно искать в каждой строке и печатать строки, которые соответствуют.

/class="\(article\|section\|subsection\)"/

Это один из моих последующих попыток Grep.

grep -i -E 'class="\(article\|section\|subsection\)"' ch18IP.htm

В этом примере я не получаю строки возвращаются ни какое-либо сообщение об ошибке. Что я здесь делаю неправильно?

Спасибо!

+0

Использование PowerShell и 'Select-String'. Множество преимуществ: значительно превосходит язык сценариев, встроенное соответствие регулярному выражению ('Select-String') с извлечением подстроки и т. Д. PowerShell выпекается в ОС в Windows 7 и более поздних версиях. –

ответ

1

У вас есть три проблемы:

1) двойные кавычки " литералы должны быть экранированы, как \" при использовании Grep на окнах.

2) мета-символы (, ) и | должны быть экранированы только \(, \) и \| при использовании основного режима. Опция exge regex -E использует более традиционную необработанную форму. Это задокументировано на http://www.gnu.org/software/grep/manual/html_node/Basic-vs-Extended.html

3) Если для параметра требуется котирование в Windows, используются двойные кавычки, а не одинарные кавычки. Но в этом случае закрытие кавычек не требуется, и на самом деле это мешает. Я объясню это позже в ответе.

Я также предлагаю вам добавить слово boundry assertation \b до class, чтобы вы не ошиблись в чем-то подобном subclass.

Так что либо из следующих должны работать:

grep -i -E \bclass=\"(article|section|subsection)\" ch18IP.htm 
grep -i \bclass=\"\(article\|section\|subsection\)\" ch18IP.htm 

Это становится сложнее, если вы хотите вложить свой аргумент поиска в кавычках, так как поисковый термин также включает в себя цитату литералы, а также отравляющие символы, такие как |, которые имеют особый смысл для командной оболочки cmd. Таким образом, вы можете избежать некоторых символов для grep и cmd.exe. См. https://stackoverflow.com/a/19816688/1012053 для получения дополнительной информации.

В вашем случае, вот два варианта того, как вы могли бы процитировать свой поисковый запрос для Windows.

grep -i -E ^"\bclass=\"(article|section|subsection)\"^" ch18IP.htm 
grep -i -E "\bclass=\"(article^|section^|subsection)\"" ch18IP.htm 

Это последняя форма выглядит могучим странно, если вы решили использовать основные регулярные выражения:

grep -i "\bclass=\"\(article\^|section\^|subsection\)\"" ch18IP.htm 
0

Получение двойных кавычек в качестве входных данных в командной строке Windows cmd.exe, как известно, проблематично. Смотрите, если это работает для вас: https://www.gnu.org/software/gawk/manual/html_node/DOS-Quoting.html

+0

Единственная информация в вашем «ответе» - это ссылка. Это подходит для комментария, но не для ответа. – dbenham