2013-09-25 4 views
1

Есть ли способ добавить текст после первого совпадения только с sed? У меня есть что-то вроде этого, но текст вставляется каждую вторую строку:SED: добавить после первого матча

sed -e '0,/priority/a\exclude = php*' /etc/yum.repos.d/epel.repo 

Файл

$ cat /etc/yum.repos.d/epel.repo 
[epel] 
name=Extra Packages for Enterprise Linux 6 - $basearch 
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch 
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch 
failovermethod=priority 
enabled=1 
gpgcheck=1 
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 
priority=3 

[epel-debuginfo] 
name=Extra Packages for Enterprise Linux 6 - $basearch - Debug 
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug 
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch 
failovermethod=priority 
enabled=0 
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 
gpgcheck=1 
priority=3 

[epel-source] 
name=Extra Packages for Enterprise Linux 6 - $basearch - Source 
#baseurl=http://download.fedoraproject.org/pub/epel/6/SRPMS 
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-6&arch=$basearch 
failovermethod=priority 
enabled=0 
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 
gpgcheck=1 
priority=3 

UPDATE:

Желаемая выход - exclude = php* должен быть только в первом репо ([epel]):

$ cat /etc/yum.repos.d/epel.repo 
[epel] 
name=Extra Packages for Enterprise Linux 6 - $basearch 
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch 
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch 
failovermethod=priority 
enabled=1 
gpgcheck=1 
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 
priority=3 
exclude = php* 
... 
+0

Где вы хотите, чтобы новая линия была? Команда, которую вы показываете, явно добавляет строку после каждой строки в указанном диапазоне. –

+0

Я обновил свой вопрос. Спасибо – HTF

ответ

4

Вы можете сказать: :

sed '/^priority/{s/.*/&\nexclude = php*/;:a;n;ba}' /etc/yum.repos.d/epel.repo 
+0

приятное использование ярлыка, умное решение! проще, чем у меня. +1 – Kent

+0

Не могли бы вы объяснить, что эти опции делают:;; a; n; ba' - похоже, что эта команда работает без них? – HTF

+0

@HTF Нет без выделенной части, строка будет добавлена ​​ко всем строкам, начинающимся с 'priority'. См. [This] (http://www.gnu.org/software/sed/manual/sed.html#Programming-Commands). – devnull

2

awk решение в дополнение к sed

awk '/^priority/ && !f {$0=$0 RS "nexclude = php*";f=1}1' file 

Если поиск будет найден и f=0, затем добавить текст и установить f=1. Это предотвращает добавление текста после всех priority.

+0

OP упоминается ** только с sed **. – Kent

+0

Я знаю, но его всегда приятно менять, возможно, OP не знал, что это возможно с помощью 'awk'. Плюс код 'awk' может быть более простым для понимания/чтения по сравнению с кодами в' sed' – Jotne

+0

хорошей точкой. Согласен. – Kent

1
sed '/priority/{x;/1/{x;b};s/^/1/;x;s/.*/&\nexclude = php*/}' file 

вышеуказанная линия может работать для вас.

Смежные вопросы