私たちには価値がある
XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"
私たちは価値を得なければなりませんXX WBP 8-501 Misc Receipts
。
以下のように試しましたが、XXのみが返されます。
echo XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]" | cut -d" " -f9 | sed 's/"//g'
答え1
スキーマに応じていくつかの列を追加するだけですcut
。
cut -d' ' -f9-13 | sed 's/"//g'
純粋なソリューションを使用することもできますsed
。
sed 's/.*"\(.*\)" ".*"$/\1/'
パターンは、文字列の末尾にある2つの二重引用符によって異なります。これにより、2つのうちの最初の項目(または文字列全体から2番目の二重引用符で囲まれた部分文字列)が表示されます。
修正する:echo
OPが望むように...
echo 'XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"' | sed 's/.*"\(.*\)" ".*"$/\1/'
答え2
文字列を入力すると、echo
シェルは二重引用符を使用するため、9番目のフィールドの長さがわかりません。まず、文字列を一重引用符で囲む必要があります。
cut
次に、区切り文字でスペースを探し、引用符内のスペースを無視する方法がわからないことを考慮する必要があります。したがって、次のようにします。
echo 'XX_EMAIL_GL_BTCH_ATTACH FCP_REQID=8830260 FCP_LOGIN="APPS/pwd" FCP_USERID=4807 FCP_USERNAME="USER" FCP_PRINTER="noprint" FCP_SAVE_OUT=Y FCP_NUM_COPIES=1 "XX WBP 8-501 Misc Receipts" "[email protected]"' | cut -d" " -f9- | cut -d\" -f 2
最初はcut
9番目のフィールドから始まるすべてを保持し、2番目は"
区切り文字で最初の引用符のペア内の部分のみを保持します。
pureを使用してsed
同じことを実行できます。
sed -E 's/([^ ]* ){8}//;s/"//;s/".*//'
とにかく前の列フィールドにスペースを追加すると、スクリプトが破損する可能性があります。
答え3
cut
抽出中に使用すると、安定したソリューションは提供されません。ロジックその入力の部分文字列です。
次のソリッドソリューションのいずれかを使用します。
1)Python
コマンド(単純化):
python -c 'import csv,sys; r=csv.reader(sys.stdin, delimiter=" "); print(next(r)[8])' <file
Python~のデータセットモジュールIDは、表形式のデータの読み書きに適しています。
2)GNUawk
注文する:
awk -v FPAT='"[^"]+"|[^"]+' '{ gsub("\"","",$8); print $8 }' file
出力は次のとおりです両方方法:
XX WBP 8-501 Misc Receipts