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