freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
bars
Сообщения: 940
ОС: BSD/LINUX
Контактная информация:

freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение bars »

Добрый вечер.
Не пойму, почему не работает вставка исключения в команде sed в системе FreeBSD.

Код: Выделить всё

sed -i '' '/\/test\//!s/^root \/usr\/local\/www\//d' /mnt/my.dom.local 
s/root: Событие не найдено.
В виртуал хосте есть два корня. тот что с my.dom.local не нужен

Код: Выделить всё

root /usr/local/www/test/;
root /usr/local/www/my.dom.local;
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение /dev/random »

Вы используете tcsh? Насколько я помню, там символ "!" имеет специальное значение даже в одинарных кавычках. Попробуйте экранировать его символом "\".
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение olecya »

bars
Кроме того, ошибка в синтаксисе substitution. Еще один прямой слэш поставьте перед командой d и еще точку с запятой, потому что команда d не является модификатором к substution, а выполняется как отдельная команда.
Добавлено (21:27):
Но судя по всему команда d лишняя, а значит вместо нее поставьте один прямой слэш
Добавлено (21:47):
bars писал:
24.08.2023 21:09
'/\/test\//!s/^root \/usr\/local\/www\//d'
Для таких случаев доступен специальный синтаксис:

Код: Выделить всё

'\,/test/,!s,^root /usr/local/www/,,'
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20799
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение Bizdelnick »

А что по задумке должна делать эта команда? Смотрю и не понимаю.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 940
ОС: BSD/LINUX
Контактная информация:

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение bars »

Bizdelnick писал:
25.08.2023 01:00
А что по задумке должна делать эта команда? Смотрю и не понимаю.
В виртуал хосте есть два корня. тот что с my.dom.local не нужен

Код: Выделить всё

root /usr/local/www/test/;
root /usr/local/www/my.dom.local;
Добавлено (10:27):
olecya писала:
24.08.2023 21:22
'\,/test/,!s,^root /usr/local/www/,,'
Не совсем понимаю это.

Код: Выделить всё

sed '\,/test/,!s,^root /usr/local/www/,,' /mnt/my.dom.local;
s,: Событие не найдено.
Добавлено (10:30):
/dev/random писал:
24.08.2023 21:22
Вы используете tcsh? Насколько я помню, там символ "!" имеет специальное значение даже в одинарных кавычках. Попробуйте экранировать его символом "\".
не помогает.

Код: Выделить всё

sed '/\/test\//\!s/^root \/usr\/local\/www/d' /mnt/my.dom.local
sed: 1: "/\/test\//!s/^root \/us ...": unterminated substitute in regular expression
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение /dev/random »

bars писал:
25.08.2023 10:26
не помогает.
Помогает. Вы успешно исправили ошибку синтаксиса tcsh "событие не найдено" и впервые смогли успешно запустить sed, что позволило вам увидеть ошибку синтаксиса sed "unterminated substitute in regular expression". Исправляйте теперь её.

Рассмотрите вашу команду '/\/test\//\!s/^root \/usr\/local\/www/d' поблочно:
* /A/!B: там, где не найдено выражение A (\/test\/), выполнить команду B (s/^root \/usr\/local\/www/d)
* s/A/B/C: заменить выражение A (^root \/usr\/local\/www) на строку B (d) с опциями поиска и подстановки С (которые вы не указали, и слэш между B и C тоже забыли). Об этом отсутствующем слэше он и пишет.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 940
ОС: BSD/LINUX
Контактная информация:

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение bars »

не понял ничего.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение /dev/random »

bars писал:
25.08.2023 10:47
не понял ничего.
Что именно не поняли? Распишите построчно. Хотя бы первый абзац моего сообщения поняли?
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 940
ОС: BSD/LINUX
Контактная информация:

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение bars »

Код: Выделить всё

sed '/test/\!s/root \/usr\/local\/www\/.*;//g' /mnt/my.dom.local
так удаляет, но остается символ переноса строки, как его удалить?

Код: Выделить всё

До
include conf/ssl_conf;
root /usr/local/www/my.dom.local/;
}
После
include conf/ssl_conf;

}
не хочется применять дополнительную сортировку /^$/d.

Код: Выделить всё

sed '/test/\!s/root \/usr\/local\/www\/.*;//g;/^$/d'
Хотелось просто через оператора d удалить строку.
Последний раз редактировалось bars 25.08.2023 11:56, всего редактировалось 1 раз.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение /dev/random »

bars писал:
25.08.2023 11:28
так удаляет, но остается символ переноса строки, как его удалить?
Команда s редактирует содержимое строки, и в том числе может сделать её пустой, но не может её удалить. Для удаления строки используется команда d. Выше вы пытались объединить команды s и d в синтаксически некорректный гибрид.

Команда d не имеет параметров, это просто одна буква. Как и перед любой другой командой, перед ней можно указать выражение для поиска (так называемый "адрес"), но вы не можете указать там /^root \/usr\/local\/www/, поскольку уже указали /\/test\//\!, а у команды может быть только один адрес.

Чтобы обойти эту проблему, вы можете использовать составную команду {команда1;команда2;команда3;...}, содержащую в вашем случае только одну команду. Выглядеть будет так: адрес1 { адрес2 команда } (пробелы можно убрать). В вашем случае адрес1 - это /\/test\//\!, адрес2 - /^root \/usr\/local\/www/, а команда - d.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: freebsd sed '/\/test\//!s/root \/usr\/local\/www\//d'

Сообщение olecya »

bars
Не вытерпела, переключила оболочку (мало того что POSIX sed). Вот как выглядит ваша команда в командной оболочке tcsh и в системе FreeBSD :

Код: Выделить всё

sed '\|/test/|\!{\|^root /usr/local/www/|d;}' /mnt/my.dom.local
Прошу заметить, точка с запятой перед фигурной закрывающей скобочкой обязательна!
В этом примере заменила запятые, используемые мной ранее в примере на пайпы. Найдите закономерность :)
Добавлено (16:00):
Вот как это бы оптимально выглядело в GNU sed в любой оболочке:

Код: Выделить всё

sed '\|/test/|b;\|^root /usr/local/www/|d' /mnt/my.dom.local
Добавлено (16:18):
Придумала вариант и для FreeBSD:

Код: Выделить всё

sed '\|/test/|p;\|^root /usr/local/www/|d' /mnt/my.dom.local
Добавлено (16:26):
Внимание! Приведенный выше вариант будет выводить двойные строки если в файле обнаружатся другие пути в которых есть /test/, но для данного примера получилось прикольно.
Спасибо сказали:
Ответить