Эта последовательность:
[^#]* # Accept some string of characters that are **not** the start character.
# # Followed by an start character #
[^@]* # Followed by an string of **not** ending characters.
@ # Followed by an ending character.
Повторение несколько раз захватило бы (почти )всю линию.
Вот так:
s/[^#]*#\([^@]\)@/\1\n/g
Это преобразует строку ввода в несколько строк в соответствии с запросом.
Единственное, чего не хватает, это стереть то, что может остаться.
sed 's/[^#]*#\([^@]*\)@/\1\n/g;s/\(.*\)\n.*$/\1/'
Это потому, что apt-cache
станет "тихим" и не будет печатать эти строки, если его стандартный вывод не является tty.
Вы можете переопределить это определение, установив его "тихость" на 0:
$ apt-cache -q=0 show contractor 2>&1 | grep virtual
N: Can't select versions from package 'contractor' as it is purely virtual