Вы можете попробовать это с помощью awk. Он выведет номер строки в случае совпадения.
$ awk '/^\|/ || /\|\|/ || /\|$/{print $0}' input_test
apple|banana|pear||grapefruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|
Основываясь на ваших изменениях к первоначальному вопросу, я переработал команду awk.
Объяснение: Awk будет соответствовать одному из трех условий
Поскольку awk распознает | как оператор, когда мы пытаемся найти соответствие "|", мы должны использовать "\" перед ним.
Теперь эти 3 условия объединяются вместе с "||", что awk интерпретирует как "or". Когда одно из этих трех условий будет выполнено, будет напечатана вся строка.
Чтобы определить нулевой столбец (столбцы), можно использовать
awk -F"|" '!length($1) || !length($4) {print $0} ' input_test
Если ваша библиотека правильно определяет свое сонам, вы можете без проблем установить несколько версий. Например, в настоящее время у меня установлены три версии libreadline
:
$ ls -l /lib/x86_64-linux-gnu/libreadline.so.*
lrwxrwxrwx 1 root root 18 Dec 4 2015 /lib/x86_64-linux-gnu/libreadline.so.5 -> libreadline.so.5.2
-rw-r--r-- 1 root root 263352 Dec 4 2015 /lib/x86_64-linux-gnu/libreadline.so.5.2
lrwxrwxrwx 1 root root 18 Oct 4 2016 /lib/x86_64-linux-gnu/libreadline.so.6 -> libreadline.so.6.3
-rw-r--r-- 1 root root 296792 Oct 4 2016 /lib/x86_64-linux-gnu/libreadline.so.6.3
lrwxrwxrwx 1 root root 18 Jan 24 16:17 /lib/x86_64-linux-gnu/libreadline.so.7 -> libreadline.so.7.0
-rw-r--r-- 1 root root 309168 Jan 24 16:17 /lib/x86_64-linux-gnu/libreadline.so.7.0
Это работает, потому что программы ссылаются на soname, поэтому все, что создано для версии 5, ссылается на libreadline.so.5
, все, что создано для версии 6, ссылается на libreadline.so.6
и т. д.Требование со стороны библиотеки состоит в том, что все версии с одним и тем же именем soname должны сохранять свой ABI: новые версии могут добавлять функции, но они не могут нарушать существующие функции. Любое критическое изменение подразумевает изменение сонейма.
Если все это сделано правильно (на стороне библиотеки), вам никогда не понадобится несколько версий библиотеки с одним и тем же именем soname: пока у вас есть последняя версия, вы будете иметь возможность запускать любое программное обеспечение, созданное для любой версии библиотеки с тем же именем soname. Продолжая пример libreadline
, программное обеспечение, созданное с помощью библиотеки версии 5.1, прекрасно работает с версией 5.2. (Обратное не обязательно верно; программы, использующие новые функции версии 5.2, не будут работать с версией 5.1.)
Возможно, стоит заглянуть в libtool
(да, я знаю), если вы не уже использует его: у него есть разумно используемая схема управления версиями, которая обрабатывает неровности сонимов.
Некоторые библиотеки идут на крайние меры, чтобы свести к минимуму необходимость в использовании сонимов; библиотека GNU C является примером, она широко использует управление версиями символов, чтобы избежать нарушения ABI, в то же время добавляя новые функции и обратно несовместимые изменения (она просто сохраняет старые версии, внутри библиотеки).