1

出力があります:

 <artifactId>prj-parent</artifactId>
 <version>1.11.1-Beta01-SNAPSHOT</version>

Linux コマンドを使用して 1.11.1-Beta01-SNAPSHOT のみを抽出する方法は? ありがとう!

4

6 に答える 6

5

使用できますgrep

  echo $string | grep -P -o '(?<=<version>).*?(?=</version>)'
于 2012-04-09T12:14:49.763 に答える
3
awk -F '[<>]' '$2 == "version" {print $3}'
于 2012-04-09T13:07:00.610 に答える
2

GNU sed:

sed -nr '/<\/?version>/s///gp'
于 2012-04-09T12:21:04.410 に答える
1
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
于 2012-04-09T12:14:42.490 に答える
1

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 を変更し、あなたの正規表現ハックが間違ったテキストをバージョンとして引き出します。

最良のアプローチは、入力間の関連する予想される変動のみを考慮し、不一致がある場合に文句を言う、非常に具体的な一致を作成することです。

于 2012-04-09T18:18:58.673 に答える