Оказывается, я установил / usr / ports / lang / mosh
, который является языком программирования, вместо / usr / ports / net / mosh
, который мне нужен.
И вуаля.
Попробуйте эту адаптацию вашего sed
одного вкладыша:
sed '/iface\s*\w*\s*inet6.*/,/^[^ ]/ {/^[^ i]/!d}' file
Он сопоставляет диапазон от вашего первого шаблона до первой строки, НЕ начинающейся с пробела, и удаляет строки, начинающиеся с пробела или "i" (для начальногоiface
). Нужно переосмыслить, если i
требуется после блока.
Похоже, это работает:
sed -n '/iface\s*\w*\s*inet6.*/ {:L; n; /^[ ]/bL;}; p' file
Пожалуйста, попробуйте и сообщите об этом.
Скрипт для стандарта sed
, использующий явный цикл для удаления строк:
/^iface.* inet6/ {
:again
N
s/.*\n//
/^[[:blank:]]/b again
}
Сценарий находит строки inet6
и затем добавляет следующую строку к этой строке внутри пространства шаблонов (со встроенным символом новой строки в -между ). Затем он удаляет пространство шаблона до первого символа новой строки (включительно, это удаляет исходную inet6
строку ). Это продолжается до тех пор, пока пространство шаблона не начинается с пробела (, пробела или табуляции ).
Тестирование:
$ cat file
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
auto wlx000
$ sed -f script.sed <file
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000
Тестирование на искусственных данных:
$ cat file
something1
something2
iface have a inet6 here
delete me
me too
same here
something3
something4
iface more something inet6
be gone
skip this
something5
$ sed -f script.sed <file
something1
something2
something3
something4
something5
Сценарий как "один -лайнер":
sed -e '/^iface.* inet6/ {' -e ':a' -e 'N;s/.*\n//;/^[[:blank:]]/ba' -e '}'
У вас уже есть хорошие ответы для инструмента sed
, но позвольте мне предложить другой, я считаю, гораздо более простой подход с использованиемpcregrep
:
pcregrep -Mv '^iface.*inet6(.|\n )*' file
Регулярное выражение должно быть понятным --мы ищем шаблон, начиная со строки ^iface.*inet6
, а затем группируем любой символ ИЛИ новую строку, за которой следует один пробел, повторяющийся ноль или более раз. Затем нам просто нужно указать pcregrep
, чтобы разрешить множественное -линейное сопоставление с опцией -M
и отменить все это с помощью-v
(совпадающая часть будет удалена ).