Sed - фигурные скобки, необходимые для выражения удаления, а не для замены - PullRequest
0 голосов
/ 15 ноября 2018

В ТАК вопрос Я ответил на эти два седа строки :

  • Первый:

    sed -e "1,$(expr $(sed -n '/^delay=/=' your_file.txt | tail -1) - 1)"'s/^delay=.*$//' \
        -e 's/^delay=/ens_delay=/' your_file.txt
    
  • Второе:

    sed -e "1,$(expr $(sed -n '/^delay=/=' your_file.txt | tail -1) - 1)"'{/^delay=.*$/d}' \
        -e 's/^delay=/ens_delay=/' your_file.txt
    

Во второй строке я понял, что мне нужны фигурные скобки вокруг /^delay=.*$/d, чтобы это работало. Но это не было необходимо для s/^delay=.*$// в первой строке (хотя это работает с).

Почему эта разница?

1 Ответ

0 голосов
/ 15 ноября 2018

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Ответ является урезанной копией Почему эти фигурные скобки необходимы в sed?

В соответствии со стандартом POSIX страница на sed:

Сценарий должен состоять из команд редактирования следующей формы:

[<i>address</i>[,<i>address</i>]]<i>function</i>

где function представляет односимвольный командный глагол из списка в Редактирование команд в sed , за которым следуют все применимые аргументы.

Таким образом, первый непустой символ после адреса беретсякак командный глагол.

На фигурные скобки ссылаются далее:

[<i>2addr</i>] {<i>editing command</i>
<i>editing command</i>
...
}

[ 2addr ] - это показатель того, что максимальное количество допустимых адресов равно двум.

Чтобы пояснить пункт, изложенный выше, секция Адреса sed(1) говорит:

Sed команды могут быть заданы без адресов, и в этом случае команда будет выполненадля всех строк ввода;с одним адресом, в этом случае команда будет выполняться только для строк ввода, соответствующих этому адресу;или с двумя адресами, и в этом случае команда будет выполняться для всех входных строк, которые соответствуют включенному диапазону строк, начиная с первого адреса и продолжаясь до второго адреса.Об адресных диапазонах следует помнить три вещи: синтаксис: addr1 , addr2 (т. Е. Адреса разделяются запятой);
(и другие вещи неотносящиеся к этому обсуждению)

Информационная страница GNU (info sed) имеет аналогичное описание { и } в разделе «3.4 Часто»-Используемые команды ":

{ <i>COMMANDS</i> }

В противном случае фигурные скобки используются для применения нескольких команд по одному и тому же адресу илидля вложения адресов.
Стандарт здесь не очень явный 1 , но левая скобка { на самом деле команда, которая запускает группу других команд sed (группузаканчивается правой скобкой }).

1:
, хотя, если вы прочитали всю страницу, упоминается, что:
Командные глаголы, отличные от {, a , b , c , i , r , t , w , : и # могут сопровождаться ...

...