18

XML ファイルがあります。ファイルは 1 行で構成されています。

私がやろうとしているのは、finalNumberPutty を介してファイルから " " 属性値を抽出することです。コピーをダウンロードしてメモ帳 ++ を使用して検索する必要はありません。

オンライン ツールでテストした正規表現を作成し、sedコマンド内でそれを使用してgrep 機能を複製しようとしました。コマンドは実行されますが、何も返されません。

正規表現:

(?<=finalNumber=")(.*?)(?=")

sedコマンド (何も返さない、予想される 28、ファイルの抜粋を参照):

sed -n '/(?<=finalNumber=")(.*?)(?=")/p' file.xml

ファイルの抽出:

...argo:finalizedDate="2012-02-09T00:00:00.000Z" argo:finalNumber="28" argo:revenueMonth=""...

私は近づいているように感じます (私は間違っているかもしれません)。

4

5 に答える 5

29

ここで古き良きgrepに問題はありません。

grep -E -o 'finalNumber="[0-9]+"' file.xml | grep -E -o '[0-9]+'

-E拡張正規表現に使用し-o、一致する部分のみを出力します。

于 2013-01-23T12:26:57.283 に答える
12

すでに回答を選択していますが、純粋な sed で実行できる方法は次のとおりです。

sed -n 's/^.*finalNumber="\([[:digit:]]\+\)".*$/\1/p' <test

出力:

28

これにより、行全体が一致番号に置き換えられて印刷されます( p は行全体を印刷するため、行全体を置き換える必要があるため)

于 2013-01-23T16:28:51.713 に答える
2

これはうまくいくかもしれません(GNU sed):

sed -r 's/.*finalNumber="([^"]*)".*/\1/' file
于 2013-01-23T15:20:49.763 に答える
1

sed先読みアサーションをサポートしていません。ただし、Perl は次のことを行います。

perl -ne 'print $1 if /(?<=finalNumber=")(.*?)(?=")/'
于 2013-01-23T12:23:38.503 に答える
-1

私が理解しているように、ここで先読みを使用する必要はありません。これを試してみてください

sed -n '/finalNumber="[[:digit:]]\+"/p'
于 2013-01-23T12:25:00.697 に答える