grep 結果にスペースと特殊文字が含まれています。

grep 結果にスペースと特殊文字が含まれています。

lshwから結果を取得し、bash配列に追加して新しい文字列を作成しようとしています。使っています

lshw -class disk |egrep -A 7 .'-d' |grep 'product' |cut -b 17-

出力は次のとおりです

Samsung SSD 850
Samsung SSD 840
ST8000AS0002-1NA
ST8000AS0002-1NA
Samsung SSD 870
Samsung SSD 870
ST8000VN0022-2EL
Flash Drive FIT
Flash Drive FIT
ST8000AS0002-1NA
ST8000VN0022-2EL
Samsung SSD 870
Samsung SSD 870
ST8000VN004-2M21

この出力をbash配列に追加しようとしましたが、スペースで区切られた単語の各行が配列の要素になります。このコマンドの結果も表示できます。

for w in $(lshw -class disk |egrep -A 7 .'-d' |grep 'product' |cut -b 17-); do printf "$w \n" ;done

出力

Samsung
SSD
850
Samsung
SSD
840
ST8000AS0002-1NA
ST8000AS0002-1NA
Samsung
SSD
870
Samsung
SSD
870
ST8000VN0022-2EL
Flash
Drive
FIT
Flash
Drive
FIT
ST8000AS0002-1NA
ST8000VN0022-2EL
Samsung
SSD
870
Samsung
SSD
870
ST8000VN004-2M21

スペースで区切られた行を文字列として保持するには?

答え1

mapfileおそらく最も簡単です。

mapfile -t myarray < <(lshw -class disk |egrep -A 7 .'-d' |grep 'product' |cut -b 17-)

ただし、リテラル配列を使用せずに結果のみを繰り返す場合は、次のことができます。

lshw -class disk |egrep -A 7 .'-d' |grep 'product' |cut -b 17- | while read w ; do [something with w] ; done

答え2

引用コマンドの置き換え:

# for w in "$(lshw -class disk |egrep -A 7 .'-d' |grep 'product' |cut -b 17-)"; do printf "$w \n" ;done
USB3.0 DISK00               
USB3.0 DISK01
USB3.0 DISK02
MS/MS-Pro
SD/MMC
Compact Flash
SM/xD-Picture
ST1000DM003-1CH1
WDC WD20EZAZ-00G

forこれにより、「USB3.0 DISK00」「USB3.0 DISK01」...がループに渡されます。

関連情報