これは、必要に応じて純粋に Bash で処理する 1 つの方法です。awks、sed、その他のものはありません。
#!/bin/bash
shopt -s extglob
IFS=,
while read -r LINE; do
OUTPUT=()
while [[ -n $LINE ]]; do
case "$LINE" in
+([[:digit:]]).+([[:digit:]]).+([[:digit:]]).+([[:digit:]]))
OUTPUT[${#OUTPUT[@]}]=$LINE
break
;;
+([[:digit:]]).+([[:digit:]]).+([[:digit:]]).+([[:digit:]]),*)
OUTPUT[${#OUTPUT[@]}]=${LINE%%,*}
LINE=${LINE#*,}
;;
+([[:digit:]]).+([[:digit:]]).+([[:digit:]]).\[+([[:digit:],-])\]*)
SET=${LINE%%\]*}
PREFIX=${SET%%\[*}
read -a RANGES <<< "${SET:${#PREFIX} + 1}"
for R in "${RANGES[@]}"; do
case "$R" in
+([[:digit:]]))
OUTPUT[${#OUTPUT[@]}]=${PREFIX}${R}
;;
+([[:digit:]])-+([[:digit:]]))
X=${R%%-*} Y=${R##*-}
if [[ X -le Y ]]; then
for (( I = X; I <= Y; ++I )); do
OUTPUT[${#OUTPUT[@]}]=${PREFIX}${I}
done
else
for (( I = X; I >= Y; --I )); do
OUTPUT[${#OUTPUT[@]}]=${PREFIX}${I}
done
fi
;;
esac
done
LINE=${LINE:${#SET} + 2}
;;
*)
# echo "Invalid token: $LINE" >&2
break
esac
done
echo "${OUTPUT[*]}"
done
の入力に対して
192.168.38.[217,222],192.168.40.215,192.168.41.[219-222]
bash temp.sh < temp.txt を実行すると、結果が得られます
192.168.38.217,192.168.38.222,192.168.40.215,192.168.41.219,192.168.41.220,192.168.41.221,192.168.41.222
範囲とも一致します。X が Y より遅い場合、たとえば 200 ~ 100 の場合、200 ~ 100 のサブセットで IPS が生成されます。スクリプトは複数行の入力も処理できます。
また、[100,200-250] のような混合範囲でも機能するはずです。