2017-12-21 3 views
0

Javaプログラムによって生成されたファイル名の名前を抽出しようとしています。このJavaプログラムは複数の行を吐き出し、ファイル名の形式が何であるかを正確に知っています。unixの複数の行からファイル名を抽出する

ABCASJASLEKJASDFALDSF 
Generated file YANNANI-0008876_17.xml. 
TDSFALSFJLSDJF; 

私は変数に出力をキャプチャして、次の形式でのsed演算子を適用しています:

sed -n 's/.*\(YANNANI.\([[:digit:]]\).\([xml]\)*\)/\1/p' 

結果を次のようにJavaプログラムを吐き出している情報テキストがありますセットには、次のとおりです。

YANNANI-0008876_17.xml. 

はしかし、私の問題は、ファイル名の抽出が.xmlで停止したいということです。最後のドットは決して抽出されるべきではありません。

sedを使用してこれを行う方法はありますか?あなたのキャプチャグループが実際にキャプチャするもので

+0

Javaプログラムを制御できる場合は、機械で読み取り可能な出力(多分JSONまたは必要な場合はXML)を作成します。 – tripleee

答えて

0

見てみましょう:

$ grep 'YANNANI.\([[:digit:]]\).\([xml]\)*' infile 
Generated file YANNANI-0008876_17.xml.

あなたが意図したもので、おそらくではありません:

  • \([[:digit:]]\)がちょうど一桁を取り込み(およびその周辺のキャプチャグループにはありません何もしないでください)
  • \([xml]\)*は、「xm、またはlの0回以上」のいずれかであるため、空の文字列と一致しますBOVE –またはラインは全く一致しません!)、xxxlllmxxxxxmmmmlxlxmxlmxlmxml、...
  • あなたはキャプチャグループの後に何も一致しないため、最終的な期間が削除された方法はありません代わりに理にかなって何

  • マッチ "の数字またはアンダースコア、0以上":[[:digit:]_]*
  • マッチ.xml 、文字通り(ピリオドをエスケープ):\.xml
  • ライン(この場合は単なる期間)の残りの部分は、文字列の正規表現だから、あなたのキャプチャグループ

.*を追加することで一致していることを確認します「抽出するために、好きdは

$ grep 'YANNANI.[[:digit:]_]*\.xml' infile 
Generated file YANNANI-0008876_17.xml.

なり、SEDを使用してオンライン上の他のすべてを削除するために、我々は.*\(... \).*で正規表現を囲む:

$ sed -n 's/.*\(YANNANI.[[:digit:]_]*\.xml\).*/\1/p' infile 
YANNANI-0008876_17.xml 

これは、実際に.を意味し、YANNANI(任意の文字)を前提としています。

+0

ベンジャミンありがとう。それは私にも正規表現を理解する助けとなりました。 – user7684845

0

あなたが二回をsedを呼び出すことができます。を印刷する最初ので、その後交換モード:sedの

sed -n 's/.*\(YANNANI.\([[:digit:]]\).\([xml]\)*\)/\1/p' | sed 's/\.$//g' 

最後によってフェッチされたすべての行の末尾に.すべての最後を削除しますあなたの最初は

をsedのか、あなたが好むよう、あなたはawk解決のために行くことができます。

awk '/.*YANNANI.[0-9]+.[0-9]+.xml/{print substr($NF,1,length($NF)-1)}' 

これは、あなたの正規表現にマッチするすべての行の最後のフィールドを印刷します(最後の文字をsubstrで切り捨てます)。

+0

Allanありがとうございます。それも有用でした。 – user7684845

+0

お手伝いをします。あなたの問題を解決できたら、解決方法を選ぶか、答えに投票してください! :-) – Allan

関連する問題