簡體   English   中英

sed 正則表達式與預期不匹配

[英]sed regex not matching as expected

我正在嘗試使用 sed 操作 yum repofile,但它沒有按預期工作。 該文件如下所示:

[repo id]
name = value
name = value
[repo id]
name = value
name = value

這可能不是最好的方法,但我仍然想了解為什么它不起作用......

首先,我將 repo 文件變成一個大字符串:

sed ':a;N;$!ba;s/\n/:::/g' $repofile |

然后,這是不起作用的部分,我想匹配我正在尋找的特定存儲庫並修剪掉文件的其余部分。 我通過匹配開頭 [ 后跟包含正確 repo id 的字符串來做到這一點。 然后我想匹配接下來的所有內容,直到文件中的下一個打開 [ :

sed "s/^.*\(\[${repoid}\].*\[\).*/\1/" >~/trimed_repo

然后我把換行符放回去,稍后繼續用 awk 修改。

sed 's/:::/\n/g' ~/trimed_repo >~/expanded_repo

我遇到的問題是我的正則表達式似乎跳過了文件中與 $repoid 配對后的所有下一個開頭 [ 並且只匹配文件中的最后一個開頭 [ 。

我嘗試使用“惰性量詞”,但它完全阻止了正則表達式的匹配。 像這樣:

sed "s/^.*\(\[${repoid}\].*?\[\).*/\1/" >~/trimed_repo

像這樣:

sed "s/^.*\(\[${repoid}\](.*?)\[\).*/\1/" >~/trimed_repo

回答*

所以在評論中的一些幫助下,我做了這個工作:

sed "s/^.*\(\[${repoid}\][^[]*\)\[.*/\1/" >~/trimed_repo

教訓是,我應該做的是說匹配所有不是空缺的東西[直到你找到空缺[,這將防止不需要的行為。

有人可以解釋為什么在這兩種情況下這些選項的行為不同嗎? .* 在第一個實例中與文件末尾不匹配。 它在下一個指定的選項處停止。 但是在第二個實例中,它直到最后一次匹配才停止。

我指的是我原來的,破碎的例子:

sed "s/^.*\(\[${repoid}\].*\[\).*/\1/" >~/trimed_repo
$ cat file
[foo]
name = 3
name = 17
[bar]
name = 24
name = 5

$ awk -v id="foo" '/\[/{f=index($0,"["id"]")} f' file
[foo]
name = 3
name = 17

$ awk -v id="bar" '/\[/{f=index($0,"["id"]")} f' file
[bar]
name = 24
name = 5

以上只是設置一個標志( f為實測值)時,發現含有線[foo] ,例如,當它發現含有下一行清除它[ 設置f ,它會打印該行。

另請注意,與任何可能的 sed 解決方案不同,上述內容不受搜索變量中的 RE 元字符或分隔符(例如., ?, *, +, /, (, etc. )的影響,因為它正在尋找 STRING 而不是 a正則表達式。

您可以使用范圍從您的 repo 文件中提取匹配的部分。

sed -ne "/\[${repoid}\]/,/\[/{/\[${repoid}\]/p;/\[/!p}" $repofile > ~/trimed_repo

暫無
暫無

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

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