我试图用sed操作一个yum重新文件,它不像预期的那样工作。该文件如下所示:
[repo id]
name = value
name = value
[repo id]
name = value
name = value这可能不是最好的方法,但我仍然想了解为什么它不起作用.
首先,我将回购文件转换成一个大字符串:
sed ':a;N;$!ba;s/\n/:::/g' $repofile |然后,和这部分是不工作的,我想匹配我正在寻找的特定回购,并修剪掉其余的文件。我是这样做的,通过匹配开头[后面的字符串包含正确的回购id。然后我想要匹配所有其他的东西,直到下一个开口(在文件中):
sed "s/^.*\(\[${repoid}\].*\[\).*/\1/" >~/trimed_repo然后我把换行符放回去,然后用awk继续修改。
sed 's/:::/\n/g' ~/trimed_repo >~/expanded_repo我遇到的问题是,我的regex似乎跳过了所有下一个开口(在与$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发布于 2014-08-02 14:33:54
$ 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元字符或分隔符字符的影响,因为它正在查找字符串而不是正则表达式。
发布于 2014-08-01 16:32:37
您可以使用范围从回购文件中提取匹配的部分。
sed -ne "/\[${repoid}\]/,/\[/{/\[${repoid}\]/p;/\[/!p}" $repofile > ~/trimed_repohttps://stackoverflow.com/questions/25077332
复制相似问题