繁体   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