出力があります:
<artifactId>prj-parent</artifactId>
<version>1.11.1-Beta01-SNAPSHOT</version>
Linux コマンドを使用して 1.11.1-Beta01-SNAPSHOT のみを抽出する方法は? ありがとう!
使用できますgrep
:
echo $string | grep -P -o '(?<=<version>).*?(?=</version>)'
awk -F '[<>]' '$2 == "version" {print $3}'
GNU sed:
sed -nr '/<\/?version>/s///gp'
a="<artifactId>prj-parent</artifactId>\n<version>1.11.1-Beta01-SNAPSHOT</version>"
echo $a | grep -oe "<version>.*</version>" | cut -d">" -f2- | cut -d"<" -f1
TXR:
$ txr -c "@(skip)
<artifactId>@aid</artifactId>
<version>@version</version>" data.txt
aid="prj-parent"
version="1.11.1-Beta01-SNAPSHOT"
eval
そのコマンドとシェル変数version
が設定されているだけです。aid
正しいアーティファクト IDを確認できます。txr
一致するものが見つからない場合、失敗し、単語 が出力されfalse
ます。eval
この下false
に、失敗した終了ステータスが作成されます。
if $(txr -c "@(skip)
<artifactId>@aid</artifactId>
<version>@version</version>") ; then
echo "version captured: $version"
else
echo "failed to match, uh oh!"
fi
TXR で XML を抽出することは、XML パーサーを使用してノード構造にアクセスするほど理想的ではありませんが、ジョブを実行するために最小限のコンテキストにラッチする単純な正規表現を使用するよりもはるかに堅牢であり、ほんの少数の例です。
この種のタスクでは、厳密なテスト スイートを使用してソリューションをソフトウェア エンジニアリングする余裕はありません。データの変動は前もってわからないか、間違いを見つけるのが難しい一連のデータ (大きなログからの抽出など) が存在する可能性があります。(たとえば、ログの 10,000 エントリごとに 2 つが間違って抽出されている場合、誰かがバグをキャッチするでしょうか?) データも変更される可能性があります。明日誰かが XML を変更し、あなたの正規表現ハックが間違ったテキストをバージョンとして引き出します。
最良のアプローチは、入力間の関連する予想される変動のみを考慮し、不一致がある場合に文句を言う、非常に具体的な一致を作成することです。