使用正则表达式解析文件时,匹配一行直到 #,但不匹配 #

使用正则表达式解析文件时,匹配一行直到 #,但不匹配 #

我想解析我的sources.list以提取存储库列表。我有:

## Some comment
deb http://some.vendor.com/ubuntu precise stable
deb-src http://some.vendor.com/ubuntu precise stable
deb http://some.othervendor.com/ubuntu precise experimental # my current favorite

我想:

http://some.vendor.com/ubuntu precise stable
http://some.othervendor.com/ubuntu precise experimental

所以我需要:只包含开头和结尾都是“deb”的行或字符#,但不包括它。到目前为止,我有:

grep -o "^deb .*"

但是我如何匹配#或结束行而不匹配#

答案1

使用grep

grep -Po '(?<=^deb\s).*?(?=#|$)' inputFiles 

基于 @kopischke 的建议

grep -Po '(?<=^deb\s)[^#]*' inputFiles

使用sed

sed -nr '/^deb\s/s;^deb\s([^#]*)#?.*$;\1;p' inputFiles

使用awk(该解决方案基于固定字段的数量):

awk '/^deb /{print $2,$3,$4}' inputFiles

答案2

对于如此简单的匹配,无需使用sedawk;只需让您的正则表达式使用否定字符类来抓取除哈希之外的任何字符:

grep -o "^deb [^#]*"

如果需要过滤掉前面的“deb”,一个简单的循环就可以完成:

while read line; do
    echo "${line#deb }"
done <(grep -o "^deb [^#]*")

编辑:一个更简洁的单行解决方案是使用 Perl 正则表达式grep -P,它允许后向断言(参见约翰·卫斯理王子的回答)。

相关内容