XMLファイルを検索して特定の色のテキストを印刷する方法

Aug 25 2020

grep、awk、sedを試し、xmlstarletを試し始めましたが、あまりサポートされていません。

xmlstarletは、XMLの形式が正しくないと言っていると思いますが、特定の16進色を含むタグを見つけて、タグの間にテキストを出力するだけです。

私のfile.xmlは次のようになります。

<p style=" margin-left: 80.0px;">Do not print this.</p>
<p style=" margin-left: 80.0px;"><span style=" color: #595959;">Print this.</span></p>

私が試してみました

$ cat file.xml | grep -oP '(?<=\"<span style="color: #595959;">\").*?(?=\"</span>")'

grepは出力を生成しません

sed -n '/span style=" color: #595959/,/<\/span/p'  file.xml

sedは行全体を返し、その後もxmlファイルにすべての行を出力し続けますが、タグ間のテキストのみが必要です。

awk -F "[><]" '/span style=" color: #595959;"’/{print $3} file.xml

awkコマンドは実行されますが、終了したり、何も出力しません。

xmlstarletは以下を生成します:

Unescaped '<' not allowed in attributes values

これはファイル内の別の行を参照していますが、この違反がxmlstarletが停止する理由だと思います。

回答

MilanTodorovic Aug 26 2020 at 19:52

file.xmlが適切にフォーマットされたxmlではないことを考慮して、次のことができます。

grep -o '<span style=\" color: #595959;">.*</span>' file.xml | xmllint --xpath 'string(//span)' -

grepコマンドの一部は、目的のスパンタグ(タグを含む)を含む行全体を検索します。次に、行はxmllintにパイプされ、xmllintはxpathクエリを使用してテキストを検索します。同じ行にgrep基準に一致する複数のスパンタグがない場合、これが機能することに注意してください。

ただし、xmlを適切に形成している場合は、xmllint(ファイルの周りにタグを付けるだけ)のみを使用できます。これは、xmlファイルを操作するための好ましい方法です。コマンドは次のようになります。

xmllint --xpath 'string((//span[@style=" color: #595959;"])[1])' file.xml

[1]コマンドのに注意してください。これは、クエリの最初の結果を表示するために使用されます。あなたは同じスタイル属性を持つ複数のspanタグを使用している場合は、使用して、これらのテキストを取得することができ[2][3]など、