我想解析我的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
对于如此简单的匹配,无需使用sed
或awk
;只需让您的正则表达式使用否定字符类来抓取除哈希之外的任何字符:
grep -o "^deb [^#]*"
如果需要过滤掉前面的“deb”,一个简单的循环就可以完成:
while read line; do
echo "${line#deb }"
done <(grep -o "^deb [^#]*")
编辑:一个更简洁的单行解决方案是使用 Perl 正则表达式grep -P
,它允许后向断言(参见约翰·卫斯理王子的回答)。