GNU/Linux >> Tutoriels Linux >  >> Linux

Différences entre Sed sur Mac Osx et les autres Sed "standard" ?

J'ai des problèmes pour utiliser une réponse fournie sur ce site pour cette question sur une commande sed pour remplacer une ligne vide par deux autres lignes de contenu, et cela a été soulevé si la commande sed sur Mac OS (10.6.7 pour moi ) est différent. Je ne pense pas que ce soit le cas, mais je me demandais si d'autres personnes sur ce site pensaient différemment.

Réponse acceptée :

Le comportement des utilitaires shell diffère légèrement entre les variantes Unix. Il existe de nombreuses variantes Unix, avec une histoire complexe. Il existe des efforts de normalisation tels que la norme POSIX et son sur-ensemble, la spécification Single UNIX. La plupart des systèmes implémentent aujourd'hui POSIX:2001, également connu sous le nom de Single UNIX Specification version 3, avec des écarts mineurs et de nombreuses extensions. La spécification Single Unix n'est pas un tutoriel, mais la version 3 est lisible si vous avez déjà une idée de ce que fait une commande. Vous pouvez le consulter pour savoir si une fonctionnalité est standard ou une extension d'un système particulier.

La majorité des utilisateurs d'Unix utilisent Linux et n'ont utilisé aucune autre variante. Linux est livré avec des utilitaires GNU, qui ont souvent de nombreuses extensions de la norme. Vous trouverez donc beaucoup de code qui fonctionne sur Linux mais pas sur d'autres unix, car il repose sur ces extensions.

En ce qui concerne sed, consultez la spécification sed Single Unix pour le minimum que chaque système est censé prendre en charge, la page de manuel de votre système pour ce que votre implémentation prend en charge et le manuel GNU sed pour ce que la plupart des gens utilisent.

L'une des extensions non standard de GNU sed prend en charge plusieurs commandes exécutées ensemble. Par exemple, ce programme GNU sed imprime toutes les lignes contenant un a , mais change b en c d'abord :

sed -ne '/a/ {s/b/c/g; p}'

{ et } sont en fait des commandes séparées, donc pour une portabilité totale, vous devez les spécifier soit sur des lignes séparées (dans un fichier) soit dans des -e séparés arguments (sur la ligne de commande). L'absence de séparateur de commande après { et l'utilisation de ; comme séparateur de commandes sont des extensions courantes. L'absence de séparateur de commande avant } est une extension moins courante. Ceci est conforme à la norme :

sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'

Ceci n'est pas standard mais communément accepté :

sed -ne '/a/ { s/b/c/g; p; }'

Une autre extension non standard mais courante est l'utilisation de \n pour signifier une nouvelle ligne dans un s texte de remplacement (l'utilisation dans une expression rationnelle est standard). La méthode portable consiste à inclure un backslash-newline dans le script sed. Une autre extension courante est \+ , \? et \| dans les expressions rationnelles pour signifier un ou plusieurs, au plus un et une alternance ; les expressions régulières de base portables n'ont rien de tout cela. Par exemple, la première commande est un moyen non portable de remplacer des séquences contiguës d'espaces blancs par une nouvelle ligne ; la deuxième commande est un équivalent conforme aux normes.

sed -e 's/ \+/\n/'
sed -e 's/  */\
/'

Linux
  1. Différences de sous-shell entre bash et ksh

  2. Comment partager des fichiers entre Ubuntu et Mac OS X

  3. Quelle est la différence entre &> et >&en bash ?

  4. Différence entre cp -r et cp -R (commande de copie)

  5. Différence entre 'man ls' et 'ls --help' ?

Quelle est la différence entre la commande apt et apt-get ?

Vim vs Vi - Similitudes et différences entre VIM et VI ?

Différences entre les pare-feu matériels et logiciels

Différences entre nobootwait et nofail dans les systèmes de fichiers Linux

Compatibilité binaire entre Mac OS X et Linux

Copier-coller entre l'invité Hyper-V et l'hôte