Существует отличный список "примеров" команд/инкантаций для sed
, которые курировались в течение очень долгого времени в имени sed1line.txt
(http://sed.sourceforge.net/sed1line.txt). В этом файле есть отличный пример, который будет полезен в данном случае:
# if a line begins with an equal sign, append it to the previous line
# and replace the "=" with a single space
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
В случае нашего вывода dnf
/yum
мы знаем, что обернутые строки начинаются с одного или нескольких пробелов, за которыми следует двоеточие (:), а затем еще один пробел. Используя эти знания, мы можем изменить наш пример sed, чтобы учесть это, и соединить строки:
sed -r -e :a -e '$!N;s/\n[[:space:]]+://;ta' -e 'P;D'
В этом случае нам нужно принять решение, поскольку +
является частью "расширенного" набора регулярных выражений, нам нужно либо добавить -r
, чтобы использовать символ +
, либо вернуться к использованию *
вместо него (который будет соответствовать нулю или более пробелов). Любой из вариантов будет работать, пример выше был приведен для педантичной корректности.
Результат следующий:
$ dnf search jenkins-ssh-credentials-plugin-javadoc | sed -r -e :a -e '$!N;s/\n[[:space:]]+://;ta' -e 'P;D' | grep ssh
============= N/S Matched: jenkins-ssh-credentials-plugin-javadoc ==============
jenkins-ssh-credentials-plugin-javadoc.noarch : Javadoc for jenkins-ssh-credentials-plugin
Как видите, теперь grep
работает, как и ожидалось. Кроме того, это позволяет более творчески подходить к форматированию вывода, чтобы облегчить сканирование списка пакетов:
$ dnf search ssh | sed -r -e :a -e '$!N;s/\n[[:space:]]+://;ta' -e 'P;D' | sort | awk -F: '!($1~/^====/) {printf "%-40s : %s\n", $1, substr($0, index($0, $2))}'
ansible.noarch : SSH-based configuration management, deployment, and task execution system
apache-sshd-javadoc.noarch : API documentation for apache-sshd
apache-sshd.noarch : Apache SSHD
autossh.x86_64 : Utility to autorestart SSH tunnels
bareftp.x86_64 : File transfer client supporting the FTP, FTP over SSL/TLS (FTPS) and SSH
belier.noarch : Generates scripts allowing you to chain many ssh connections
btrfs-sxbackup.noarch : Incremental btrfs snapshot backups with push/pull support via SSH
...
trilead-ssh2.noarch : SSH-2 protocol implementation in pure Java
WebShell.noarch : SSL server for web-based SSH access from browsers and mobile devices
x11-ssh-askpass.x86_64 : A passphrase dialog for X and not only for OpenSSH