web-dev-qa-db-ja.com

行の一部のみのgrepファイル

このようにgrepを使用しているrtfファイルがあります

 grep "Order Number" 'Extract Text Output.rtf'

その結果、次のような行になります

\b\fs28 \cf2 Fab Order Number : FAB00772450\

結果をFAB00772450にしたい

-oを使用すると、「注文番号」という単語が返されるだけですが、それでは役に立ちません。

2
mcgrailm
_cat 'Extract Text Output.rtf' | sed -n 's/Order Number : \(.*\)\\/\1/gp'
_

まさにあなたが望むものを生み出します。

説明:

  • _sed -n_ sedのデフォルト出力を抑制します
  • _s/.../.../g_検索と置換、g:すべて/グローバル
  • Order Number : \(.*\)\\ "_Order Number :_"文字列とbackslashを探し、その間のものをグループ1に保存します。 (sedを使用することの欠点は、正規表現のグループ化演算子をエスケープする必要があることです:_(...)_ with \(...\)
  • _\1_グループ1を置換として使用
  • p一致する場合は置換を印刷

これは、ハードコードされたawkグループ($ 7)を使用するよりもはるかに柔軟で一般的です。

注1:。*を使用しますか?次のようにフォーマットされた行がある場合:

_ \cf2 Fab Order Number : FAB00772450\ \b \cf2
_

これにより、正規表現が貪欲になるのを防ぎ、最初のバックスラッシュで停止します。 sedが*をサポートしているかどうかはテストされていませんか?および+?演算子ですが、期待しましょう。

注2:行から抽出するパーツが複数ある場合は、複数のグループを使用し、置換文字列で_.../\2 - \1/_のようにフォーマットを切り替えることもできます。

3
TWiStErRob

これは私のために働きます:

grep "Order Number" test.txt | awk {'print $7'} | tr "\\\ " " "

出力:

FAB00772450

3
user1200129

この形式が常に守られているが、トークンの数が常に同じであるとは限らない場合は、次のようなものを介してパイプすることができます

sed's /.*:// '| sed's#\ ## '

これにより、「FAB00772450」も生成されます。

0
Scott C Wilson