すべての配列要素から空白を削除します

すべての配列要素から空白を削除します

という配列がありarrayvar、次のように定義されています。

arrayvar=( $(awk '/'"$vovar"'/,// {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");print}' temp1 | tr -d '\n' | sed 's/^[ \t]*//' | sed 's/[ \t]*$//') )

vovar=VARIABLES

私の一時ファイルには、上記のコマンドとtr sedスペースを削除するコマンドを使用して取得するいくつかの変数があります。
TEMP ファイル

        エンタープライズ eMylexRaidEventInformation
        変数 {
            a9イベントコード、
            a9コントローラー番号、
            a9チャンネル番号、
            a9ターゲット番号、
            a9Lun番号、
            a9イベントタイムスタンプ
        }
 説明
 「デバイスがオンラインになりました。」

 --#SUMMARY "[イベント %d ctl %d chn %d tgt %d lun %d 時刻 %d :] デバイスがオンラインになりました。"
 --#引数 {0,1,2,3,4,5}
 --#重大度情報
         --#タイムインデックス5
 --#状態は動作中
 ::= 1

このコマンドを実行すると、arrayvar[0]次のように値のみが削除されます。

echo "${arrayvar[0]}"
a9イベントコード

echo "${arrayvar[1]}"
            a9コントローラー番号

echo "${arrayvar[2]}"
            a9チャンネル番号

echo "${arrayvar[3]}"
            a9ターゲット番号

どのような助けでも大歓迎です。ありがとうございます!

答え1

次のように使用できます:

var=( $(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}') )
  • 一致するレコードVARIABLES {と一致するレコードの間のすべてのレコードを出力し}、すべてのおよび,文字を削除します。

mapfileただし、値を配列に格納するには、ダブルフォークではなくシングルフォークを使用することをお勧めします。

mapfile var < <(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}')

答え2

オプションがあるGNU の新しいバージョンgrep(Ubuntu に付属)を使用する-z:

$ IFS=, arrayvar=( $(grep -Pzo '\s+VARIABLES\s+{\K[^}]+(?=})' temp1 | tr -d '[:space:]') )

$ echo "${arrayvar[0]}"
a9EventCode

$ echo "${arrayvar[1]}"
a9ControllerNumber

$ echo "${#arrayvar[@]}"
6
  • -zこのオプションgrepにより、入力テキストの行が改行ではなく ASCII NUL で区切られて処理されるようになり、改行を文字通り一致させることができます。

  • PCREパターンは\s+VARIABLES\s+{\K[^}]+(?=})、内部のテキストと一致します。{}

  • 次に、空白(スペース、タブ、改行)を削除します。tr -d '[:space:]'

  • IFSが に設定されているため,、コンマ区切りの文字列を含む配列を作成できます。

答え3

以下のように awk ですべてを実行します。

arrayvar=($(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");all=all$0} END {print all}' temp1 ))

答え4

使用perl

perl -ne 'exit if ($start == 1 && /}/ ); if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}; $start=1 if (/'"$vovar"'/);' <your_input_file>

説明

  • exit if ($start == 1 && /}/ );

    }if VARIABLES( vovar)が渡された場合はスクリプトを終了する

  • if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}

    VARIABLES( vovar) が渡された場合は行を印刷します

  • $start=1 if (/'"$vovar"'/)

    VARIABLES( vovar) が渡された場合は開始マーカーを設定する


$ vovar=VARIABLES
$ arrayvar=($(perl -ne 'exit if ($start == 1 && /}/ ); if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}; $start=1 if (/'"$vovar"'/);' foo))
$ for((i=0;i<${#arrayvar[@]};i++)); do echo "${arrayvar[i]}"; done
a9EventCode
a9ControllerNumber
a9ChannelNumber
a9TargetNumber
a9LunNumber
a9EventTimeStamp


$ cat foo
        ENTERPRISE eMylexRaidEventInformation
        VARIABLES {
            a9EventCode,
            a9ControllerNumber,
            a9ChannelNumber,
            a9TargetNumber,
            a9LunNumber,
            a9EventTimeStamp
        }
 DESCRIPTION
 "device became online."

 --#SUMMARY "[Event %d ctl %d chn %d tgt %d lun %d Time %d :] device became online."
 --#ARGUMENTS {0,1,2,3,4,5}
 --#SEVERITY INFORMATIONAL
         --#TIMEINDEX 5
 --#STATE OPERATIONAL
 ::= 1

関連情報