![すべての配列要素から空白を削除します](https://rvso.com/image/1127630/%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E9%85%8D%E5%88%97%E8%A6%81%E7%B4%A0%E3%81%8B%E3%82%89%E7%A9%BA%E7%99%BD%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%BE%E3%81%99.png)
という配列があり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 && /}/ );
}
ifVARIABLES
(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