複数の単語を含む変数の内容全体を印刷するには?

複数の単語を含む変数の内容全体を印刷するには?

複数の単語を含む属性があります。

例:

0x1230ac1="Brown Fox is Near"

次のように、CLI インターフェイスを使用してコマンドを入力して、属性の内容を取得できます。

show attr=0x1230ac1

この「show」コマンドの出力は次のとおりです。

ID            Name                  Value
0x1230ac1     User_Attribute1       Brown Fox is Near

Bashスクリプトで同じ "show"コマンドを使用すると、次のことができます。

show attr=0x1230ac1 | sed 1d | awk '{print $1,$3,$4,$5,$6}'

値列の文字列の長さは2単語または20単語である可能性があるため、これは問題になります。私はすべての人のためにawkを作成したくありません。

私のCLIスクリプトで 'Value'に含まれるすべての単語を表示するためにawkまたはsedまたは 'Value'の内容全体を渡す方法はありますか?スクリプトの文字列変数に「値」を渡す必要があるため、これは重要です。

例:

MYSTRING=`show attr=0x1230ac1 | sed 1d | awk '{print $3-$99}' `

私はこれがprint $3-$99間違っていることを知っています。これは、可能なすべての印刷番号を入力しなくても実行したい操作の一例に過ぎません。

答え1

awkでは、空の文字列を割り当てて特定のフィールド/列を削除できます。

$ echo foo bar doo | awk '{$2 = ""; print}'
foo  doo

ただし、これにより、フィールドがあった場所にスペースが残り、以前のように行の他のasdfスペースが縮小されます。

$ echo "foo bar doo    asdf"  | awk '{$2 = ""; print}'
foo  doo asdf

代わりに、sed適切な正規表現を使用して次の操作を実行できます。

$ echo '0x1230ac1     User_Attribute1       Brown Fox is Near' |
  sed -Ee 's/([^[:space:]]+[[:space:]]+){2}//'
Brown Fox is Near

[^[:space:]]+シリーズを一致させる空白ではない文字、[[:space:]]+空白文字列、および周囲の内容は(...){2}すべて 2 回実行されるため、2 番目の空白より前の内容はすべて削除されます。スペースがスペースまたはタブの場合、これは機能します。

したがって、私の状況が正しい場合は、次のようにする必要があります。

$ show attr=0x1230ac1 | sed -E -e 1d -e 's/([^[:space:]]+[[:space:]]+){2}//'

答え2

gnu sedを使用してこれを行うことができます。

sed -nEe '2s/\S+/\n&/3;s/.*\n//p'

変数に改行文字がないとします。また、ユーザーIDにはスペースは含まれていません。

関連情報