Dans cette édition,
Stéphane Chazelas POSIXifie (encore) ma sed
mise en forme en insérant une -e
coupure xpression et une autre -e
instruction xpression. Maintenant, je pourrais simplement lui demander pourquoi dans les commentaires, je suppose, mais c'est déjà la révision numéro 18 de cette réponse et presque toutes les précédentes étaient déjà grâce à des cadeaux similaires (si vous pouvez voir les commentaires supprimés, vous saurez quoi Je veux dire) . En outre, je pense que je suis assez proche pour comprendre pourquoi formuler cela d'une manière qui pourrait être plus généralement utile. Alors, j'espère ...
Je préfère généralement garder mes sed
-e
xpressions totales à un si je le peux, mais j'ai également une plus grande préférence pour me conformer aux spécifications aussi près que possible, surtout lorsque la différence ne dépasse pas a <space>
et an -e
. Mais je ne peux pas faire ça si je ne comprends pas pourquoi je devrais. Voici un bref aperçu de l'état actuel de ma compréhension:
la
' -e '
coupure peut remplacer de manière portative une coupure desed
script\n
ewline dans unesed
déclaration de ligne de commande ... Je suis certes floue sur la raisonl'accolade fermante dans une
sed
{
fonction}
doit être précédée d'une\n
coupure de ligne électronique comme indiqué ici:- Le
<right-brace>
doit être précédé d'un<newline>
et peut être précédé ou suivi de<blank>
caractères.
- Le
une
\n
pause ewline est nécessaire de la même suite à l'utilisation ...a
,b
,c
,i
,r
,t
,w
ou:
.
Mais je ne comprends pas clairement comment la définition de la {
fonction se }
rapporte à l' !
opérateur non. La seule mention que je trouve de l'opérateur de négation dans les états de spécification:
- Une fonction peut être précédée d'un ou plusieurs
!
caractères, auquel cas la fonction doit être appliquée si les adresses ne sélectionnent pas l'espace de modèle.
Est-ce à dire que l'utilisation d'un a !
implique des {
accolades }
? Qu'en est-il des $!
commandes - devraient-elles également être séparées par des ' -e '
pauses? Est-ce ce qui a été abordé lorsque Stéphane a récemment POSIXifié ma réponse?
Je pense que c'est soit l' !
opérateur de négation, soit la b
déclaration de ranch qu'il aborde dans son édition - ou peut-être les deux à la fois - mais je ne sais pas et je voudrais le faire. Si ce n'est que la b
déclaration du ranch, alors je crois qu'un d
ferait à sa place et éliminerait le besoin de faire une ' -e '
pause, mais je préfère être certain avant de risquer une réponse POSIXifiée trois fois . Pouvez-vous m'aider?
Je l'ai risqué après tout , mais pas avec une grande certitude ...
:
- vous avez conduit cette maison il y a des mois. Mais je ne comprends pas vraiment pourquoi la deuxième sed
commande a été similaire POSIXified .
sed
est très peu claire pour moi. J'ai demandé des clarifications à quelques reprises dans le passé, mais je ne pense pas que cela ait été mis à jour en conséquence. Un bon test consiste à essayer avec le toolchest d'héritage (Solaris, dérivé de l'original et sur lequel la spécification POSIX est largement basée).
s///
substitutions doivent accepter le chaînage avec un ; . cela devient flou autour des commandes qui doivent être délimitées par un retour à la ligne et comment -e
peuvent y rester dans ce cas - du moins c'est le cas pour moi. ive encore à tomber sur un sed
qui ne les interprète pas de manière assez interchangeable.
;
avant une nouvelle ligne - une nouvelle ligne est très bien. Honnêtement, vous pouvez vous passer -e
entièrement de et de tout et simplement écrire un fichier comme #!/bin/sed
avec chaque commande sur une nouvelle ligne - ou ceux qui ne nécessitent pas de tels délimiteurs à la place délimités par ;
. Ceux qui ne nécessitent habituellement les sauts de ligne sont ceux qui prennent entrée arbitraires - :
noms d'étiquettes et les commandes qui les réfèrent à des b
ou t
ou la fermeture }
Curlies pour les fonctions, ou r
ead et w
rite qui prennent args de nom de fichier. Ils doivent tous être portés de manière portative \n
.
b;n;:b
, vous vous connectez au label appelé";n;:b"
historique et POSIX seds (et GNU sed ne l'est pas à cet égard).