GNU/Linux >> Linux Esercitazione >  >> Linux

Differenze tra Sed su Mac Osx e altri Sed "standard"?

Sto riscontrando alcuni problemi nell'utilizzo di una risposta fornita su questo sito per questa domanda su un comando sed per sostituire una riga vuota con altre due righe di contenuto, ed è stato visualizzato se il comando sed su Mac OS (10.6.7 per me ) è diverso. Non credo che lo sia, ma mi chiedevo se altri su questo sito la pensassero diversamente.

Risposta accettata:

Il comportamento delle utilità della shell differisce in modo minore tra le varianti unix. Esistono molte varianti Unix, con una storia complessa. Ci sono sforzi di standardizzazione come lo standard POSIX e il suo superset, la specifica Single UNIX. La maggior parte dei sistemi al giorno d'oggi implementa POSIX:2001, noto anche come Single UNIX Specification versione 3, con piccole deviazioni e molte estensioni. La specifica Single Unix non è un tutorial, ma la versione 3 è leggibile se hai già un'idea di cosa sta facendo un comando. Puoi consultarlo per sapere se alcune funzionalità sono standard o un'estensione di un particolare sistema.

La maggior parte degli utenti unix utilizza Linux e non ha utilizzato nessun'altra variante. Linux viene fornito con utilità GNU, che spesso hanno molte estensioni allo standard. Quindi troverai un bel po' di codice là fuori che funziona su Linux ma non su altri Unice, perché si basa su quelle estensioni.

Per quanto riguarda sed, consulta la specifica sed Single Unix per il minimo che ogni sistema dovrebbe supportare, la pagina man del tuo sistema per ciò che supporta la tua implementazione e il manuale GNU sed per ciò che usa la maggior parte delle persone là fuori.

Una delle estensioni non standard in GNU sed supporta più comandi eseguiti insieme. Ad esempio, questo programma GNU sed stampa tutte le righe contenenti un a , ma cambia b in c primo:

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

{ e } sono in realtà comandi separati, quindi per la piena portabilità, è necessario specificarli su righe separate (in un file) o in -e separati argomenti (sulla riga di comando). La mancanza di un separatore di comando dopo { e l'uso di ; come separatore di comandi sono estensioni comuni. La mancanza di un separatore di comando prima di } è un'estensione meno comune. Questo è conforme allo standard:

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

Questo non è standard ma comunemente accettato:

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

Un'altra estensione non standard ma comune è l'uso di \n per indicare una nuova riga in un s testo sostitutivo (l'uso in un'espressione regolare è standard). Il metodo portatile consiste nell'includere backslash-newline nello script sed. Un'altra estensione comune è \+ , \? e \| in regexps significare uno o più, al massimo uno e alternato; le espressioni regolari di base portatili non hanno nessuna di queste. Ad esempio, il primo comando è un modo non portatile per sostituire sequenze contigue di spazi bianchi con una nuova riga; il secondo comando è un equivalente conforme agli standard.

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

Linux
  1. Il comando Sed di Linux:utilizzo ed esempi

  2. Spiegazione delle differenze tra editor di testo Vi e Vim

  3. Come ignorare alcune differenze nel comando diff?

  4. Differenze sub-shell tra bash e ksh

  5. Linux differenza tra sudo crontab -e e solo crontab -e

Qual è la differenza tra il comando apt e apt-get?

Vim vs Vi:somiglianze e differenze tra VIM e VI?

Differenze tra firewall hardware e software

Differenze tra nobootwait e nofail nei filesystem Linux

Differenza tra 'man ls' e 'ls --help'?

Copia e incolla tra guest e host Hyper-V