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

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

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

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

SMILET 2019-11-04 14:00:01
我有一個腳本試圖從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 回答

?
婷婷同學_

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

因為這是一個常見的常見問題解答,所以讓我列出一些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
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

從 man bash


可以使用附加的二進制運算符=?,其優先級與==和!=相同。使用它時,運算符右邊的字符串將被視為 擴展的正則表達式并進行相應的匹配(如regex(3)中一樣)。


ERE不支持先行/后退。但是,您的代碼((?!Disk))中有它們。


這就是為什么您的正則表達式不符合您預期的原因。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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