刪除所有數組元素中的空格

刪除所有數組元素中的空格

我有一個名為 的數組arrayvar,其定義為

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

vovar=VARIABLES

我的臨時檔案有一些變量,我使用上面的命令和tr sed刪除空格的命令來取得這些變數。
臨時檔案

        企業 eMylexRaidEventInformation
        變數{
            a9事件代碼,
            a9控制器編號,
            a9頻道號,
            a9目標編號,
            a9Lun編號,
            a9事件時間戳
        }
 描述
 “設備已上線。”

 --#SUMMARY “[事件 %d ctl %d chn %d tgt %d lun %d 時間 %d :] 設備已上線。”
 --#參數 {0,1,2,3,4,5}
 --#嚴重性訊息
         --#TIMEINDEX 5
 --#國家運營
 ::= 1

當我執行此命令時,只會arrayvar[0]刪除其值,如下所示:

回顯“${arrayvar[0]}”
a9事件代碼

回顯“${arrayvar[1]}”
            a9 控制器編號

迴聲“${arrayvar[2]}”
            a9 頻道號

迴聲“${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

相關內容