web-dev-qa-db-ja.com

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

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

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

vovar=VARIABLES

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

 ENTERPRISE eMylexRaidEventInformation 
 VARIABLES {
 a9EventCode、
 a9ControllerNumber、
 a9ChannelNumber、
 a9TargetNumber、
 a9LunNumber、
 a9EventTimeStamp 
} 
 DESCRIPTION 
 "デバイスがオンラインになりました。" 
 
-#SUMMARY "[Event%d ctl%d chn%d tgt%d lun%d時間%d:]デバイスがオンラインになりました。 "
-#ARGUMENTS {0,1,2,3,4,5} 
-#SEVERITY INFORMATIONAL 
-#TIMEINDEX 5 
-#STATE OPERATIONAL 
 :: = 1 

このコマンドを実行すると、arrayvar[0]は、次のように値が取り除かれます。

 echo "$ {arrayvar [0]}" 
 a9EventCode 
 
 echo "$ {arrayvar [1]}" 
 a9ControllerNumber 
 
 echo "$ {arrayvar [2]}" 
 a9ChannelNumber 
 
 echo "$ {arrayvar [3]}" 
 a9TargetNumber 

任意の助けをいただければ幸いです。ありがとう!

2
SamFlynn

これを使用できます:

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}')
1
kos

_-z_オプションを持つGNU grep(Ubuntuに付属))の新しいバージョンを使用する:

_$ 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が_,_に設定されているため、コンマ区切りの文字列で配列を作成できます。

1
heemayl

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

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

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 && /}/ );

    VARIABLESvovar)が渡された場合、_}_がある場合はスクリプトを終了します

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

    VARIABLESvovar)が渡された場合、行を出力します

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

    VARIABLESvovar)が渡された場合、開始マーカーを設定します


_$ 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
_
1
A.B.