簡體   English   中英

sed / awk在正則表達式中指定范圍

[英]sed/awk specify ranges in regex

我有這樣的文件列表輸出:

/path/F201405151800
/path/F201405151900
/path/F201405152000
/path/F201405152100

我將此輸出通過管道傳遞到sed並使用以下語法:

sed -n '/F.\{8\}'$var1'/,/F.\{8\}'$var2'/p'

$ var1和$ var2是用戶輸入,可以看到,它們是指我文件列表中的一天中的不同時段。 如果找到$ var1和$ var2值,則上述語法可以完美地工作。 但是,如果$ var1的值為16,而$ var2為19 sed,則不會輸出任何內容,因為在上述文件列表范圍內找不到16。

一個解決方案是:

sed -n '/F.\{8\}1[6-9]/p'

...這是可行的,但我現在面臨的問題是如何指定兩位數范圍以包括如下內容:16-20。 我試圖像這樣在單引號之間進行遍歷:

sed -n '/F.\{8\}'{16..21}'/p'

...但是我得到的輸出是:

sed: can't read /F.\{8\}16/p: No such file or directory
sed: can't read /F.\{8\}17/p: No such file or directory
sed: can't read /F.\{8\}18/p: No such file or directory
sed: can't read /F.\{8\}19/p: No such file or directory
sed: can't read /F.\{8\}20/p: No such file or directory
sed: can't read /F.\{8\}21/p: No such file or directory

我真的不需要使用sed,我用awk探索了一些選項,但是無法獲得我想要的東西,主要問題是我不知道如何指定正則表達式RS,因此我將小時數作為awk字段並執行一些條件

'$2 > 16 && $2 < 21 {print}'

嘗試添加-e

sed -n -e '/F.\{8\}'"$var1"'/,/F.\{8\}'"$var2"'/p'

並始終引用變量以防止單詞分裂。

更新:

awk -v A=17 -v B=21 -F/ '!/\/F[0-9]{12}$/{next} {h = substr($NF, 10, 2)} h >= A && h <= B'

您可以使用以下awk:

awk -F'/' '{h=$3; gsub(/^F[0-9]{6}|[0-9]{4}$/, "", h)} h > 12 && h < 21' file
/path/F201405151800
/path/F201405151900
/path/F201405152000
/path/F201405152100

為了獲得兩位數的范圍,您可以嘗試執行以下操作:

sed -n '/F.\{8\}(1[6-9]|2[01])/p'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM