2

Я хочу проанализировать мой 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 .*"

Но как мне сопоставить # или конец строки, не сопоставляя #?

2 ответа2

6

Используя 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 , который учитывает утверждения позади (см . Ответ принца Джона Уэсли).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .