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