大きな行文字列の開始と終了の一致に基づいてhtmlエンティティに依存せずにフィルタリングし、長さに関係なくパターン間にテキストを保持します。

大きな行文字列の開始と終了の一致に基づいてhtmlエンティティに依存せずにフィルタリングし、長さに関係なくパターン間にテキストを保持します。

次のような1行のファイルがあります。パスツールビンしかし、はるかに長いです。


私の目標は、example1:start with <aend with </a>
example2:start with PZend withの文字列部分のみをフィルタリングすることですs16
。したがって、各場合、テキストはHTMLエンティティに依存せず、一致の間に保持されます。

FreeBSDHTMLエンティティに依存する解決策はすでにあります。

  1. 複数行で美しく飾るtidy -i -m -w 160 -ashtml -utf8 ~/file
  2. 文字列が含まれていない場合は行を削除するsed -i '' '/\<\/a\>/!d' ~/file

ところで、HTMLエンティティに依存せずに直接フィルタを実行しようとしています。現時点では、一致の正確な先頭のみを取得できますが、フィルタリングしている文字列の内容がどれほど長いかわからないため、一致の終わりを正確に取得することはできません。予期しない結果の再現手順をご覧ください。

予期しない結果を再現する手順

wget -O ~/file https://pastebin.com/raw/xbti369J
grep -E -o ".{0,0}PZ.{0,46}" ~/file

結果

固定長を要求したため、行が正しくありません。
PZ</td><td class="s15">€ 1.20</td><td class="s16
PZ</td><td class="s15"></td><td class="s16">A</t
目的は、長さに関係なく、次のように結果的な線パターンを得ることです。
PZ</td><td class="s15">€ 1.20</td><td class="s16
PZ</td><td class="s15"></td><td class="s16

ベストアンサー1

のようなXMLパーサーを使いたいですxmllint

a次のXPath式を使用して要素間のテキストをフィルタリングします。

xmllint --html --xpath '//a/text()' <file>

おすすめ記事