Можно ли sed
добавить новую строку под определенным содержимым, если входное содержимое существует, то оставить его?
Текущее содержимое файлаssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
Желаемое содержимое файлаssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
apache 4.2
Я могу добавить контент с помощью следующей команды
sed -i '/Os version rhel5.6/a apache 4.2' ssss
Мой вопрос
Я хочу добавить строку под указанным контентом, если контент существует в файле, то оставить его. Если контент не существует, то добавить его.
решение1
Это perl
выражение сработает,
perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Объяснение
next if /apache 4.2/
пропускает все строки, соответствующиеapache 4.2
.s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print
ищетOs version rhel5.6
и заменяет строку такой же с добавлениемapache 4.2
новой строки.
Проверьте свой входной файл
$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
apache 4.2
решение2
Вот один из способов сделать это sed
:
sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile
Это добавляет apache 4.2
безусловно ко всем строкам, соответствующим друг другу, Os version rhel5.6
затем (если не на последней строке) он вставляет следующую строку через n
(печать пространства шаблона), и если содержимое нового пространства шаблона соответствует, apache 4.2
он удаляет его. При необходимости отрегулируйте регулярное выражение, чтобы включить начальные/конечные пробелы, например/^[[:blank:]]*apache 4\.2[[:blank:]]*$/d