删除所有数组元素中的空格

删除所有数组元素中的空格

我有一个名为的数组arrayvar,其定义为

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

vovar=VARIABLES

我的临时文件有一些变量,我使用上面的命令和tr sed删除空格的命令来获取它们。临时
文件

        企业 eMylexRaid 事件信息
        变量 {
            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 {和匹配记录之间的每条记录},删除每个and,字符

但是我宁愿使用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

相关内容