簡體   English   中英

將重復的正則表達式模式捕獲為一組,bash 腳本中的 sed

[英]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.

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