У меня есть файл HTML momcpy.html
из которого я хочу извлечь определенную строку после данной строки. Содержание файла похоже:
<tr><br>
<th height="12" bgcolor="#808080"><label for="<br>
LSCRM:Abhijeet<br>
<br>
MCRM:Bhargav<br>
<br>
TLGAPI:GAURAVAURAV<br>
<br>
MOM:MANIKA"></td><br>
Это присутствует на одной из строк HTML.
Я хочу извлечь Manika
и сохраните его в переменной. Так В основном я хочу извлечь независимо от того, что строка присутствует после МАМЫ: Это могло быть динамично.
Я попробовал:
file='/home/websphe/tomcat/webapps/MOM/web/momcpy.html'
y=$( awk '$1=="MOM:"{print $2}' $file)
echo "$y"
Но это не работало.
Я не могу разумно советовать делать это, потому что парсинг HTML с regex вряд ли закончится хорошо, но Вы смогли получать строку MANIKA
с
sed -nr '/MOM:/ s/.*MOM:([^"]+).*/\1/p' file
Это работает хорошо над Вашим образцом так или иначе...
-n
ничего не печатайте, пока мы не попросим его-r
используйте ДО/string/
найдите строки с string
s/old/new/
замена old
с new
.*
любое количество любых символов([^"]+)
сохраните некоторые символы, которые не являются "
\1
обратная ссылка на сохраненные символыp
распечатайте просто строки, которые мы изменилиgrep -Po 'MOM:\K[^"]+' file.html
Предупреждение: это не очень надежное решение; И ваш HTML-код недействителен
Строка, которую Вы ищете всегда, имеет MOM:
перед ним, но Вы не сказали, имеет ли это всегда "
после него. В целях этого ответа я предположу, что Вы ищете строки, которым разрешают содержать любой нижний регистр или прописные буквенные символы, цифры или символы нижнего подчеркивания. Они известны как словесные символы в терминологии регулярных выражений. Распознавание таких "слов" текста достаточно полезно, который большинство диалектов регулярных выражений имеет функции, чтобы помочь сделать так. Если это не то, что Вы хотите, можно изменить это решение соответственно, или можно использовать методы в других ответах.
Я повторяю David Foerster, Zanna, и мудрые предупреждения JJOAO о парсинге HTML с regex и об этом не быть устойчивым. Будьте осторожны, и рассмотрите, действительно ли то, что Вы запросили, точно, что Вы хотите сделать. В Вашем примере кода Вы присвоили путь к входному файлу к переменной $file
, таким образом, я предположу, что это было сделано. Вы присвоили вывод своей команды к $y
, таким образом, я сделаю то же.
grep
Это подобно методу JJOAO, и можно использовать тот метод с заменой команды также, если регулярное выражение там больше подходит потребностей.
y="$(grep -oPm1 'MOM:\K\w+' "$file")"
-oPm1
просто более компактный способ записать -o -P -m 1
.
-o
печать только соответствия, не целая строка.-P
PCRE использования, который поддерживает \K
отбрасывать текст, подобранный до сих пор, таким образом, это не включено в подобранный текст, который возвращается.-m 1
остановки после соответствия шаблону одно время. Таким образом, Вы присваиваете просто первое соответствие переменной, а не несколько соответствий, разделенных новыми строками.Обратите внимание, что можно также добавить -m1
к команде в ответе JJOAO, таким образом, это использует только соответствия от первой строки, которая имеет любого.
Если первая строка с соответствием содержит несколько соответствий, это grep
метод дает Вам всех их. Например, если та строка MOM:MANIKA MOM:JANE"></td><br>
затем $y
будет содержать значение:
MANIKA
JANE
sed
Это напоминает метод Zanna.
y="$(sed -rn '0,/.*MOM:(\w+).*/ s//\1/p' "$file")"
Помимо того, чтобы быть включенным как замена команды, различия то, что я:
\w+
) вместо символов до a "
([^"]+
).*
) во-первых, так, чтобы MOM:
не должен появляться в самом начале строкиТехника, которую я использовал для этого, требует GNU sed
, но это sed
реализация обеспечивается в Ubuntu.
Если первая строка с соответствием содержит несколько соответствий, это sed
метод дает Вам просто последний. От MOM:MANIKA MOM:JANE"></td><br>
Вы добираетесь:
JANE