引用符で囲まれた完全な単語を取得するコマンド

引用符で囲まれた完全な単語を取得するコマンド

私たちには価値がある

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番目の二重引用符で囲まれた部分文字列)が表示されます。

修正する:echoOPが望むように...

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

最初はcut9番目のフィールドから始まるすべてを保持し、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

関連情報