XMLファイルを検索して特定の色のテキストを印刷する方法
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が停止する理由だと思います。
回答
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]など、