Просто добавление к различиям, упомянутым здесь в других ответах.
Поскольку вызов библиотеки — это просто вызов функции, переключения из пространства пользователя в пространство ядра не происходит. С другой стороны, системный вызов приводит к переключению из пространства пользователя в пространство ядра, поскольку системный вызов работает в режиме ядра.
sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ]/#&/p'
Не работает так, как вы ожидаете, это скорее совпадение:[...]
— это набор совпадающих символов. Внутри этой коллекции у вас есть диапазон -n
от пробела (0x20 )доn
(0x6E ), который может включать[
(0x5B ), в зависимости от ваших региональных настроек. Таким образом, коллекция соответствует первому символу. Видите, что происходит, когда вы берете #&___
в качестве замены... не в ваших намерениях, я полагаю?
И это причина того, что ваш полный регистр не работает. :Соответствующим символом для коллекции является ]
, потому что за ним следует остальная часть шаблона, поэтому туда вставляется #
.
Проблема с расширенным регулярным выражением аналогична предположению @steeldriver :$
привязывает шаблон:
A ( '$' ) outside a bracket expression shall anchor the expression or subexpression it ends to the end of a string; such an expression or subexpression can match only a sequence ending at the last character of a string. For example, the EREs "ef$" and "(ef$)" match "ef" in the string "abcdef", but fail to match in the string "cdefab", and the ERE "e$f" is valid, but can never match because the 'f' prevents the expression "e$" from matching ending at the last character.
Таким образом, в ERE литерал $
необходимо экранировать, а в BRE его нужно экранировать только в том случае, если он является последним символом шаблона.
Также обратите внимание, что -e
помечает следующий аргумент как сценарий и является необязательным, если имеется только один сценарий, а -E
является переключателем. Удаление -e
вместо ' -E `работает только в том случае, если есть только один сценарий, потому что он все равно был излишним.