В этом редактировании
Stéphane Chazelas POSIX исправляет (снова) мое sed
форматирование, вставляя -e
разрыв xpression и еще -e
один оператор xpression. Теперь, я мог бы просто спросить его, почему в комментариях, я полагаю, но это уже редакция № 18 для этого ответа, и почти все предыдущие были уже благодаря подобной халяве (если вы видите удаленные комментарии, вы будете знать, что Я имею в виду) . Кроме того, я думаю, что я достаточно близок к пониманию того, почему формулировать это так, чтобы это могло быть более полезным в целом. Так что надеемся ...
Как правило, я предпочитаю, чтобы мои общие sed
-e
выражения были равны единице, но я бы также предпочел соответствовать спецификации настолько близко, насколько я могу, особенно когда разница составляет не более чем a <space>
и an -e
. Но я не могу сделать это, если я не понимаю, почему я должен. Вот краткое изложение текущего состояния моего понимания:
' -e '
перерыв может переносимый стоять в течениеsed
сценария\n
перерыва ewline вsed
командной строке заявлении ... Я правда нечеткий о том, почемузакрывающей скобке в
sed
{
функции}
должен предшествовать\n
разрыв строки, как указано здесь:<right-brace>
Должен предшествовать<newline>
и может предшествовать или следовать за<blank>
персонажами.
\n
перерыв ewline аналогично требуется после любого использования ...a
,b
,c
,i
,r
,t
,w
, или:
.
Но я не совсем понимаю, как определение {
функции }
относится к !
неоператору. Единственное упоминание об операторе отрицания, которое я нахожу в спецификации:
- Функции может предшествовать один или несколько
!
символов, и в этом случае функция должна применяться, если адреса не выбирают пространство шаблона.
Значит ли это, что использование скобок !
подразумевает ? Что из команд - они также должны быть разделены перерывами? Было ли это то, что было решено, когда Стефан в последний раз POSIXified мой ответ?{
}
$!
' -e '
Я думаю, что это либо !
оператор отрицания, либо оператор b
ранчо, к которому он обращается в своем редактировании - или, возможно, это оба одновременно - но я не знаю и хотел бы этого. Если это толькоb
ранчо заявление, то я считаюd
, бы на своем месте и устранить необходимость ' -e '
перерыва, но я предпочел бы быть уверенным , прежде чем трижды рискуя POSIXified ответ. Вы можете помочь?
Я рискну все - таки , а не с какой - либо большой долей уверенности ...
:
роль - ты поехал домой несколько месяцев назад. Но я не совсем понимаю, почему вторая sed
команда была так же POSIXified .
sed
меня очень неясна. Я просил разъяснения несколько раз в прошлом, но я не думаю, что это было обновлено в результате. Хорошим тестом является попытка использования инструментальной панели семейной реликвии (Solaris, взятой из оригинала и на которой в значительной степени основана спецификация POSIX).
s///
учреждения должны принимать цепочку с ; , оно расплывчато вокруг команд, которые должны быть разделены новой строкой, и как они -e
могут стоять в этом случае - по крайней мере, для меня. Я еще не наткнулся на, sed
который не интерпретирует их довольно взаимозаменяемо, хотя.
;
перед новой строкой - новая строка в порядке. Честно говоря, вы можете обойтись без -e
и все полностью и просто написать файл, как #!/bin/sed
с каждой командой на новой строке - или те, которые не требуют таких разделителей вместо разделителей ;
. Те , которые делают требуют перевода строки , как правило , являются те , которые принимают произвольные входные - :
имена меток и команды , которые относятся к ним , как b
и t
или закрывать }
Curlies для функций, или r
EAD и w
обряда , которые принимают имя файла арг. За ними все должно следовать \n
.
b;n;:b
этого вы";n;:b"
переходите на метку, называемую в исторических и POSIX-сборках (и GNU sed не в этом отношении).