亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Bash正則表達式-似乎無法匹配\ s,\ S等

Bash正則表達式-似乎無法匹配\ s,\ S等

喵喔喔 2019-11-03 15:04:29
我有一個腳本試圖從gparted獲取信息塊。我的數據如下所示:Disk /dev/sda: 42.9GBSector size (logical/physical): 512B/512BPartition Table: msdosNumber  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.xmlModel: VMware Virtual disk (scsi)Disk /dev/sdb: 42.9GBSector size (logical/physical): 512B/512BPartition Table: msdosNumber  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)我使用正則表達式將其分為兩個磁盤塊^磁盤(/ dev [\ S] +):((?! Disk)[\ s \ S])*這適用于多行。當我在bash腳本中對此進行測試時,我似乎無法匹配\ s或\ S-我在做什么錯?我正在通過如下腳本進行測試:data=`cat disks.txt`morematches=1x=0regex="^Disk (/dev[\S]+):((?!Disk)[\s\S])*"if [[ $data =~ $regex ]]; thenecho "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;        fidonefi但是,當我遍歷正則表達式的各個部分時,無論何時匹配\ s或\ S,它都不起作用-我在做什么錯?
查看完整描述

3 回答

?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

因為這是一個常見的常見問題解答,所以讓我列出一些Bash不支持的結構,以及如何解決它們,這里有一個簡單的解決方法。


正則表達式有多種常用方言。Bash支持的是擴展正則表達式的變體。例如,這不同于許多在線正則表達式測試器支持的功能,后者通常是更現代的Perl 5 / PCRE變體。


擊不支持\d \D \s \S \w \W-這些可以與POSIX字符類等同替換[[:digit:]],[^[:digit:]],[[:space:]],[^[:space:]],[_[:alnum:]],和[^_[:alnum:]],分別。(請注意最后一種情況,其中[:alnum:]POSIX字符類使用下劃線增強,以完全等同于Perl的\w速記形式。)

Bash不支持非貪婪匹配。有時您可以a.*?b用類似的東西代替,a[^ab]*b以在實踐中獲得類似的效果,盡管兩者并不完全相同。

Bash不支持非括號(?:...)。在平凡的情況下,只需使用捕獲括號即可(...);當然,如果您使用捕獲組和/或反向引用,則會重新編號捕獲組。

擊不支持lookarounds像(?<=before)或者(?!after),事實上任何與(?是一個Perl擴展。盡管您經常可以將問題改寫為可以避免環顧的問題,但沒有簡單的常規解決方法。



查看完整回答
反對 回復 2019-11-04
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

我知道您已經“解決”了這個問題,但是您最初的問題很可能就像$regex在測試中不引用一樣簡單。即:


if [[ $data =~ "$regex" ]]; then

Bash變量擴展將簡單地放入字符串中,并且原始正則表達式中的空格將破壞測試,因為:


regex="^Disk (/dev[\S]+):((?!Disk)[\s\S])*"

if [[ $data =~ $regex ]]; then

等價于:


if [[ $data =~ ^Disk (/dev[\S]+):((?!Disk)[\s\S])* ]]; then

bash / test會很有趣地解釋獎金參數和所有未引用的元字符。


請記住,bash不會傳遞變量,而是會擴展變量。



查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 542 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號