web-dev-qa-db-ja.com

bashスクリプトを使用して、HTMLファイルから特定の文字列の後に特定の文字列を抽出する

特定の文字列の後に特定の文字列を抽出する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の行の1つに存在します。

Manikaを抽出して変数に保存したい。したがって、基本的にはMOM:の後に存在する文字列をすべて抽出したいのですが、それは動的である可能性があります。

私が試してみました:

file='/home/websphe/Tomcat/webapps/MOM/web/momcpy.html'
  y=$( awk '$1=="MOM:"{print $2}' $file)
 echo "$y"

しかし、それはうまくいきませんでした。

5
Abhijeet Anand

正規表現でhtmlを解析するとうまく終了しない可能性が高い ですが、文字列MANIKAを取得できる可能性があるため、これを行うことを賢明にアドバイスすることはできません

sed -nr '/MOM:/ s/.*MOM:([^"]+).*/\1/p' file

とにかくサンプルで問題なく動作します...

ノート

  • -n要求するまで何も出力しない
  • -r EREを使用
  • /string/stringで行を検索
  • s/old/new/oldnewに置き換えます
  • .*任意の数の任意の文字
  • ([^"]+)"以外の文字を保存します
  • \1保存された文字への後方参照
  • p変更した行のみを印刷します
7
Zanna
grep -Po 'MOM:\K[^"]+' file.html

警告:これは非常に堅牢なソリューションではありません。そして、あなたのHTMLは無効です

5
user216043

探している文字列は常にMOM:の前にありますが、その後に常に"があるかどうかはわかりません。この答えの目的のために、小文字または大文字のアルファベット文字、数字、またはアンダースコアを含むことが許可されている文字列を探していると仮定します。これらは 正規表現 の用語で Word文字 として知られています。このようなテキストの「単語」の一致は、正規表現のほとんどの方言にそうするのに役立つ機能があるほど十分に有用です。これが望んでいない場合は、それに応じてこのソリューションを変更するか、他の回答のテクニックを使用できます。

私はエコーします David Foerster'sZanna's 、および JJoao's 正規表現でHTMLを解析することに関する賢明な警告と、これが堅牢ではないことについて。注意してください、そしてあなたが要求したことが本当にやりたいことかどうかを考慮してください。サンプルコードでは、入力ファイルへのパスを変数$fileに割り当てているため、これが行われたと想定します。コマンドの出力を$yに割り当てたので、同じことをします。

grepを使用

これは JJoaoのメソッド に似ており、正規表現がニーズにより適している場合は、コマンド置換でもそのメソッドを使用できます。

y="$(grep -oPm1 'MOM:\K\w+' "$file")"

-oPm1は、-o -P -m 1を記述するためのよりコンパクトな方法です。

JJoaoの答え のコマンドに-m1を追加することもできることに注意してください。これにより、anyを持つ最初の行の一致のみが使用されます。

一致する最初の行に複数の一致が含まれる場合、このgrepメソッドはすべての一致を提供します。たとえば、その行がMOM:MANIKA MOM:JANE"></td><br>の場合、$yは値を保持します。

MANIKA
JANE

sedを使用

これは Zannaのメソッド に似ています。

y="$(sed -rn '0,/.*MOM:(\w+).*/ s//\1/p' "$file")"

コマンド置換として囲まれていることに加えて、違いは次のとおりです。

  • match を含む最初の行の後に停止
  • \w+")までの文字の代わりに1つ以上のWord文字([^"]+)に一致します
  • 最初にゼロ個以上の任意の文字(.*)を消費するため、MOM:を行の先頭に表示する必要はありません
  • パターンを2回書くことを避ける、よりコンパクトな構文を使用します。

これに使用した手法 には GNU sed が必要ですが、それはUbuntuで提供される sed 実装です。

一致する最初の行に複数の一致が含まれる場合、このsedメソッドは最後の行のみを提供します。 MOM:MANIKA MOM:JANE"></td><br>から以下を取得します。

JANE
1
Eliah Kagan