Добавьте строку под каждой строкой, соответствующей шаблону, только если ее еще нет.

Добавьте строку под каждой строкой, соответствующей шаблону, только если ее еще нет.

Можно ли 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

Связанный контент