我有一个脚本,试图从gparted获取信息块。
我的数据看起来像:
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 316MB 315MB primary ext4 boot
2 316MB 38.7GB 38.4GB primary ext4
3 38.7GB 42.9GB 4228MB primary linux-swap(v1)
log4net.xml
Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 316MB 315MB primary ext4 boot
5 316MB 38.7GB 38.4GB primary ext4
6 38.7GB 42.9GB 4228MB primary linux-swap(v1)
我使用正则表达式将其分成两个磁盘块。
^Disk (/dev[\S]+):((?!Disk)[\s\S])*
使用多行功能,此方法有效。
当我在bash脚本中测试时,似乎无法匹配\s
或\S
,我做错了什么?
我是通过以下脚本进行测试的:
data=`cat disks.txt`
morematches=1
x=0
regex="^Disk (/dev[\S]+):((?!Disk)[\s\S])*"
if [[ $data =~ $regex ]]; then
echo "Matched"
while [ $morematches == 1 ]
do
x=$[x+1]
if [[ ${BASH_REMATCH[x]} != "" ]]; then
echo $x "matched" ${BASH_REMATCH[x]}
else
echo $x "Did not match"
morematches=0;
fi
done
fi
但是,当我测试正则表达式的部分时,每当我匹配到\s
或\S
时,它都不能正常工作——我做错了什么?
\s
和\S
是PCRE扩展,它们不在ERE(Posix扩展正则表达式)标准中。只要庆幸你没有尝试使用BRE。 - Charles Duffyx=$[x+1]
是一个古老的语法;((x++))
是现代的 bash 版本,或者x=$((x + 1))
是现代的 POSIX 版本。在[ ]
中使用==
不符合 POSIX 标准;要么使用[[ ]]
(它不试图符合 POSIX 标准,并且通过具有关闭字符串分割的解析时规则来允许您不引用),要么使用=
而不是==
(并将其设置为[ "$morematches" = 1 ]
,带有引号!)。始终引用您的扩展:echo "$x did not match"
;否则,在$x
中的通配符会被扩展并压缩空格的运行。 - Charles Duffy