![刪除所有數組元素中的空格](https://rvso.com/image/1127630/%E5%88%AA%E9%99%A4%E6%89%80%E6%9C%89%E6%95%B8%E7%B5%84%E5%85%83%E7%B4%A0%E4%B8%AD%E7%9A%84%E7%A9%BA%E6%A0%BC.png)
我有一個名為 的數組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 && /}/ );
若有
}
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