首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed正则表达式不匹配

sed正则表达式不匹配
EN

Stack Overflow用户
提问于 2014-08-01 09:44:33
回答 2查看 129关注 0票数 2

我试图用sed操作一个yum重新文件,它不像预期的那样工作。该文件如下所示:

代码语言:javascript
复制
[repo id]
name = value
name = value
[repo id]
name = value
name = value

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

首先,我将回购文件转换成一个大字符串:

代码语言:javascript
复制
sed ':a;N;$!ba;s/\n/:::/g' $repofile |

然后,和这部分是不工作的,我想匹配我正在寻找的特定回购,并修剪掉其余的文件。我是这样做的,通过匹配开头[后面的字符串包含正确的回购id。然后我想要匹配所有其他的东西,直到下一个开口(在文件中):

代码语言:javascript
复制
sed "s/^.*\(\[${repoid}\].*\[\).*/\1/" >~/trimed_repo

然后我把换行符放回去,然后用awk继续修改。

代码语言:javascript
复制
sed 's/:::/\n/g' ~/trimed_repo >~/expanded_repo

我遇到的问题是,我的regex似乎跳过了所有下一个开口(在与$repoid配对的文件后面的文件中),并且只匹配(文件中的)最后一个开口。

我试过使用“惰性量词”,但它完全阻止了正则表达式的匹配。就像这样:

代码语言:javascript
复制
sed "s/^.*\(\[${repoid}\].*?\[\).*/\1/" >~/trimed_repo

就像这样:

代码语言:javascript
复制
sed "s/^.*\(\[${repoid}\](.*?)\[\).*/\1/" >~/trimed_repo

答案*

因此,在我的评论中有一些帮助,我这样做是可行的:

代码语言:javascript
复制
sed "s/^.*\(\[${repoid}\][^[]*\)\[.*/\1/" >~/trimed_repo

教训是,我应该说的是,匹配所有不是开口的东西(直到你找到一个开口),这将防止不必要的行为。

有人能解释为什么在这两个实例中这些选项的行为是不同的吗?.*与第一个实例中的文件末尾不匹配。它在下一个指定选项处停止。但在第二种情况下,直到比赛的最后一次出现,它才会停止。

我指的是我最初的,破碎的例子:

代码语言:javascript
复制
sed "s/^.*\(\[${repoid}\].*\[\).*/\1/" >~/trimed_repo
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-02 14:33:54

代码语言:javascript
复制
$ 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

例如,当找到包含[foo]的行时,上面只设置一个标志([foo]为finds ),并在找到包含[的下一行时清除它。设置f时,它会打印这条线。

还请注意,与任何可能的sed解决方案不同,上述内容将不受搜索变量(例如., ?, *, +, /, (, etc.)中的RE元字符或分隔符字符的影响,因为它正在查找字符串而不是正则表达式。

票数 2
EN

Stack Overflow用户

发布于 2014-08-01 16:32:37

您可以使用范围从回购文件中提取匹配的部分。

代码语言:javascript
复制
sed -ne "/\[${repoid}\]/,/\[/{/\[${repoid}\]/p;/\[/!p}" $repofile > ~/trimed_repo
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25077332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档