0

特定のテキストを検索した後、テキストの次の文字を印刷する必要があるプロジェクト要件があります。

よりよく理解するために、ここに例を示します。

ファイルがindex.htmlあり、テキストを検索した後に特定のテキストを印刷したいと考えています。

質問: にテキスト<b>WELCOME</b>がありますindex.html。今、私は を検索し、まで<b>テキストを印刷したいと思います。WELCOME</b>

bash# cat index.html | grep "" ?? 

Linux でシェル コマンドまたはシェル スクリプトを使用してこのコンテンツを印刷する方法を教えてください。

4

2 に答える 2

0

そのために sed を使用できます:

sed -n -e 's/.*<b>\([^<]*\)<\/b>.*/\1/p' index.html

「-n」フラグは、指定した行のみを印刷するようにsedに指示します。

「s」コマンドは、正規表現に一致する文字列を別の文字列に置き換えます。正規表現 (regex) について説明します。

  1. .*文字列にマッチ
  2. <b>それぞれの文字列に一致します
  3. \([^<]*\)はもう少し複雑です。手始めに、バックスラッシュで始まる括弧は、一致するものを補助変数に格納するように sed に指示します。は[^<]文字以外の任意の文字<と一致し、その後に続くアスタリスクは、そのシーケンス (つまり、 ではない文字のシーケンス) と一致する必要があることを示します<
  4. <\/b>は文字列に一致し</b>ますが、正規表現の終わりだと sed を混乱させないように、スラッシュ文字をバックスラッシュでエスケープする必要があります。
  5. .*別の文字列に一致

正規表現の後に、何を代用するかを sed に伝える文字列が続きます。この場合、\1最初のキャプチャ グループを出力するように sed に指示するだけです (つまり、上記のパート 3 が一致したすべて、つまり と の間のすべてを意味します<b>) </b>

最後に、最後のスラッシュの後に、置換された行を「p」文字で出力するように sed に指示します。上記の「-n」フラグを使用したため、正規表現と一致しない行は出力されません。

これが役立つことを願っています=)

于 2012-09-29T19:58:11.950 に答える
0

現在のページのタイトルをすばやく汚い方法で印刷する例:

wget -q -O - 'http://tinyurl.com/9n6wayk' |
    sed -n '/<title>/{s:<title>\(.*\)</title>:\1:;p;q;}'

sed コマンドの詳細:

  • -n一致する行のみを表示するオプションがあります
  • //冒頭の部分は のようなものgrepです: 一致する行で作業します
  • {}コマンドを囲むためにあります
  • これs:::は置換です (区切り文字は任意の文字にすることができます。デフォルトは です/)
  • \(.*\)キャプチャを行っています
  • \1 はキャプチャされた文字列です
  • p変更された文字列を出力するためにありますか
  • q行に一致した直後に終了することはありますか

よりクリーンなアプローチは、Python、Ruby、Perl などの第 3 世代言語でXpathを使用することです。

現在のスタック オーバーフロー ページのシェルで Xpath を使用する簡単な方法:

xmllint 2>/dev/null --html \
    --xpath '/html/head/title/text()' \
    http://tinyurl.com/9n6wayk

xmllintlibxmlの一部です

于 2012-09-29T20:04:28.883 に答える