このようにgrepを使用しているrtfファイルがあります
grep "Order Number" 'Extract Text Output.rtf'
その結果、次のような行になります
\b\fs28 \cf2 Fab Order Number : FAB00772450\
結果をFAB00772450にしたい
-oを使用すると、「注文番号」という単語が返されるだけですが、それでは役に立ちません。
_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/
_のようにフォーマットを切り替えることもできます。
これは私のために働きます:
grep "Order Number" test.txt | awk {'print $7'} | tr "\\\ " " "
出力:
FAB00772450
この形式が常に守られているが、トークンの数が常に同じであるとは限らない場合は、次のようなものを介してパイプすることができます
sed's /.*:// '| sed's#\ ## '
これにより、「FAB00772450」も生成されます。