[英]capture repeating regex pattern as one group, sed in bash script
我寫了一個從有效文本行中提取兩條數據的工作表達式。 第一個捕獲組是包括句點的數字部分。 第二個是該行的剩余字符,只要該行有效。 如果數字部分以句點結尾或行以數字結尾,則該行無效。
1.1 the quick 1-1 (no match due to ending hypen and number)
11.2 brown fox jumped (should return '11.2' and 'brown fox jumped')
1.41.1 over the lazy (should return '1.41.1' and 'over the lazy')
2.1. dog (no match due to numerical section trailing period)
在各種正則表達式測試站點上進行測試時,表達式^((?:[0-9]+\.)+[0-9]+) (.*)[^0-9]$
有效。
我的問題是......我未能調整此表達式以與 bash 腳本中的 sed 一起使用,該腳本循環通過文本行 ($L)。
IFS=$'\t' read -r NUM STR < <(sed 's#^\(\(?:[0-9]\+\.\)\+[0-9]\+\) \(.*)[^0-9]$#\1\t\2#p;d' <<< $L )
下面是我用重復數字和句點替換重復組的捕獲的地方。 我不希望這樣做,因為它可以匹配以句點開頭的行和連續的多個句點。 它也丟失了捕獲字符串的最后一個字符,但我希望我能弄清楚那部分。
FS=$'\t' read -r NUM STR < <(sed 's#^\([0-9\.]\+[0-9]\+\) \(.*[^0-9]\)$#\1\t\2#p;d' <<< $L )
請幫助我理解我做錯了什么。 謝謝你。
一個 ERE 將是:
^([0-9]+(\.[0-9]+)*) (.*[^0-9])$
\1
和\3
是感興趣的捕獲組
但我不確定使用sed
+ read
是捕獲變量數據的最佳方法; 您可以只使用bash
內置函數:
#!/bin/bash
while IFS=' ' read -r num str
do
[[ $num =~ ^([0-9]+(\.[0-9]+)*)$ && $str =~ [^0-9]$ ]] || continue
declare -p num str
done < input.txt
但是,此解決方案有一個副作用: read
將刪除行的前導、尾隨和第一個中間空格++字符。
如果您需要這些空格字符,則可以匹配整行:
#!/bin/bash
regex='^([0-9]+(\.[0-9]+)*) (.*[^0-9])$'
while IFS='' read -r line
do
[[ $line =~ $regex ]] || continue
num=${BASH_REMATCH[1]}
str=${BASH_REMATCH[3]}
declare -p num str
done < input.txt
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.