Подтвердить что ты не робот

Удалить с помощью другого разделителя

Честно говоря, я пропустил что-то очевидное!

$ cat test.txt
  00 30 * * * /opt/timebomb.sh >> timebomb.log
  01 30 * * * /opt/reincarnate.sh >> reincarnation.log
$ sed ':timebomb:d' test.txt
  00 30 * * * /opt/timebomb.sh >> timebomb.log
  01 30 * * * /opt/reincarnate.sh >> reincarnation.log

тогда

$ sed '/timebomb/d' test.txt
  01 30 * * * /opt/reincarnate.sh >> reincarnation.log

Почему это так? Для команды d не поддерживается другой набор разделителей?

4b9b3361

Ответ 1

Разделители //, которые вы используете, не предназначены для команды d, они предназначены для адресации. Я думаю, вы сравниваете их с косой чертой в команде s///... Однако, хотя оба относятся к регулярным выражениям, они представляют собой разные контексты.

Адрес (который отображается до) фильтрует, в какие строки применяется эта команда... Параметры (которые появляются после) используются для управления применяемая замена.

Если вы хотите использовать разные разделители для регулярного выражения в адресе, вам нужно запустить адрес с обратной косой чертой:

$ sed '\:timebomb:d' test.txt
  01 30 * * * /opt/reincarnate.sh >> reincarnation.log

(Чтобы понять разницу между адресом и параметрами, рассмотрите вывод команды:

$ sed '/timebomb/s/log/txt/' test.txt

Адрес выбирает только строку (строки), содержащую регулярное выражение timebomb, но опции сообщают команде s заменить регулярное выражение log на txt.)

Ответ 2

Двоеточие предшествует метке в sed, поэтому ваша sed-программа выглядит как несколько ярлыков, ничего не происходит. Парсер может видеть двоеточия как разделители, если ему предшествует команда s, так что особый случай.

Ответ 3

использовать gawk

gawk '!/timebomb/' file > newfile

Ответ 4

вы можете просто использовать оболочку, не нужны внешние инструменты

while read -r line
do 
    case "$line" in
        *timebomb* ) continue;;
        *) echo "$line";;
    esac        
done <"file"