Come Utilizzare il Comando sed su Linux

0
375
Fatmawati Achmad Zaenuri/Shutterstock

Può sembrare pazzesco, ma Linux sed comando è un editor di testo, senza un’interfaccia. Si può usare da riga di comando per modificare il testo in file e flussi. Vi mostreremo come sfruttare il suo potere.

La Potenza di sed

Sed comando è un po ‘come gli scacchi: ci vuole un’ora per imparare le basi e una vita per padroneggiare (o, almeno, un po’ di pratica). Ti mostriamo una lista di apertura gambit in ciascuna delle principali categorie di sed funzionalità.

sed è un editor di flusso che opera su sottofondo di ingresso o file di testo. Non disporre di un testo interattivo interfaccia dell’editor, tuttavia. Piuttosto, si forniscono le istruzioni per seguire il testo. Tutto questo funziona in Bash e altri riga di comando di shell.

Con sed è possibile eseguire una delle seguenti operazioni:

  • Selezionare il testo
  • Sostituire il testo
  • Aggiungere linee di testo
  • Elimina linee di testo
  • Modificare (o mantenere) un file originale

Abbiamo strutturato il nostro esempi per introdurre e illustrare i concetti, non per produrre il tersest (e meno accessibile) comandi di sed. Tuttavia, il pattern matching e la selezione del testo funzionalità di sed si basano molto sulle espressioni regolari (espressioni regolari). Si sta andando ad avere bisogno di avere una certa familiarità con questi per ottenere il meglio dalla sed.

CORRELATI: Come Usare le Espressioni Regolari (espressioni regolari) su Linux

Un Semplice Esempio

In primo luogo, stiamo andando a utilizzare l’eco di inviare il testo con sed, attraverso un tubo, e hanno sed sostituire una parte del testo. Per farlo, tipo il seguente:

eco howtogonk | sed ‘s/gonk/geek/’

Il comando echo invia “howtogonk” in sed, e la nostra semplice sostituzione regola (la “s” sta per ” sostituzione) è applicato. sed cerca il testo di input per un’occorrenza della prima stringa, e sostituisce tutte le partite con la seconda.

La stringa “gonk” è sostituito da “geek”, e la nuova stringa viene stampata nella finestra del terminale.

Le sostituzioni sono probabilmente l’uso più comune di sed. Prima di poter scendere più in profondità nelle sostituzioni, però, abbiamo bisogno di sapere come selezionare e testo corrispondente.

La Selezione Del Testo

Stiamo andando a bisogno di un file di testo per i nostri esempi. Useremo uno che contiene una selezione di versi da Samuel Taylor Coleridge poema epico “The Rime of The Ancient Mariner.”

Basta digitare le seguenti a dare un’occhiata a meno:

meno coleridge.txt

Per selezionare alcune righe del file, vi forniamo l’inizio e la fine delle linee di gamma si desidera selezionare. Un singolo numero seleziona una riga.

Per estrarre le linee di uno a quattro, digitiamo questo comando:

sed -n ‘1,4 p’ coleridge.txt

Nota la virgola tra 1 e 4. P significa “stampa abbinati linee.” Per impostazione predefinita, sed stampe di tutte le linee. Ci piacerebbe vedere tutto il testo nel file con le linee di corrispondenza stampato due volte. Per evitare questo, utilizzeremo i -n (tranquilla) opzione per eliminare l’impareggiabile di testo.

Cambiamo i numeri di riga in modo che possiamo selezionare un altro versetto, come mostrato di seguito:

sed -n ‘6,9 p’ coleridge.txt

Siamo in grado di utilizzare l’-e (espressione) opzione per effettuare selezioni multiple. Con due espressioni, siamo in grado di selezionare due versi, in questo modo:

sed -n-e ‘1,4 p’ -e ‘31,34 p’ coleridge.txt

Se riduciamo il primo numero della seconda espressione, possiamo inserire uno spazio tra le due versi. Digitiamo il seguente:

sed -n-e ‘1,4 p’ -e ‘30,34 p’ coleridge.txt

Possiamo anche scegliere una linea di partenza e di raccontare sed per il passaggio attraverso il file e di stampa alternativo righe, ogni riga di quinta, o saltare qualsiasi numero di linee. Il comando è simile a quelli utilizzati in precedenza per selezionare un intervallo. Questa volta, però, si usa un carattere tilde ( ~ ), invece della virgola per separare i numeri.

Il primo numero indica la linea di partenza. Il secondo numero indica sed le righe dopo la linea di partenza si desidera vedere. Il numero 2 indica che ogni seconda linea, 3 significa che ogni terza riga, e così via.

Digitiamo il seguente:

sed -n ‘1~2p’ coleridge.txt

Non si può sempre sapere dove il testo che si sta cercando si trova nel file, il che significa che i numeri di riga non è sempre di grande aiuto. Tuttavia, è anche possibile utilizzare sed per selezionare le righe che contengono il testo corrispondente modelli. Per esempio, si può estrarre tutte le righe che iniziano con “E.”

L’accento circonflesso (^) rappresenta l’inizio della linea. Staremo a racchiudere il nostro termine di ricerca nella barra (/). Abbiamo anche includere uno spazio dopo “E” parole come “Android” non essere inclusi nel risultato.

Lettura sed gli script possono essere un po ‘ difficile in un primo momento. L’ /p significa “la stampa”, proprio come ha fatto con i comandi che abbiamo usato in precedenza. Il comando seguente, però, una barra precede:

sed -n ‘/^E /p’ coleridge.txt

Tre righe che iniziano con “E ” sono estratti dal file e visualizzati per noi.

Facendo Sostituzioni

Nel nostro primo esempio, vi abbiamo mostrato il seguente formato di base per un sed sostituzione:

eco howtogonk | sed ‘s/gonk/geek/’

La s dice sed questa è una sostituzione. La prima stringa è la stringa di ricerca, e il secondo è il testo che si desidera sostituire il testo corrispondente. Naturalmente, come con tutte le cose di Linux, il diavolo è nei dettagli.

Abbiamo digitare il seguente per modificare tutte le occorrenze di “giorno” a “settimana” e dare il mariner e albatross più tempo per bond:

sed -n ‘s/giorno/settimana/p’ coleridge.txt

Nella prima riga, la seconda occorrenza di “giorno” è cambiato. Questo è perchè si ferma dopo la prima partita per linea. Dobbiamo aggiungere una “g” al fine dell’espressione, come mostrato di seguito, per eseguire una ricerca globale così tutte le partite, in ogni riga sono elaborati:

sed -n ‘s/giorno/settimana/gp’ coleridge.txt

Questo corrisponde a tre dei quattro in prima linea. Perché la prima parola è “Giorno” e sed, è case-sensitive, non prendere in considerazione l’istanza per essere lo stesso come “il giorno”.

Basta digitare le seguenti, l’aggiunta di un io al comando, al fine dell’espressione per indicare la sensibilità:

sed -n ‘s/giorno/settimana/gip’ coleridge.txt

Questo funziona, ma non sempre si desidera attivare e minuscole per tutto. In questi casi, è possibile utilizzare le espressioni regolari gruppo per aggiungere pattern specifici e minuscole.

Per esempio, se si allega caratteri tra parentesi quadre ([]), sono interpretati come “qualsiasi carattere dall’elenco di caratteri.”

Abbiamo digitare il seguente, e comprendono la “D” e “d” del gruppo, per garantire che corrisponde a “Giorno” e “il giorno”:

sed -n ‘s/[Dd]ay/settimana/gp’ coleridge.txt

Possiamo inoltre limitare le sostituzioni sezioni del file. Diciamo che il file contiene strano spaziatura nel primo versetto. Possiamo utilizzare il seguente comando familiare per vedere la prima strofa:

sed -n ‘1,4 p’ coleridge.txt

Cercheremo di trovare due spazi e la loro sostituzione con uno di loro. Faremo questo, globalmente, l’azione si ripete su tutta la linea. Per essere chiari, il modello di ricerca è spazio, lo spazio asterisco (*), e la stringa di sostituzione è un singolo spazio. Il 1,4 limita la sostituzione per le prime quattro righe del file.

Abbiamo messo tutto insieme nel seguente comando:

sed -n ‘1,4 s/ */ /gp’ coleridge.txt

Questo funziona bene! Il criterio di ricerca è ciò che è importante qui. L’asterisco (*) rappresenta zero o più caratteri precedenti, che è uno spazio. Pertanto, il criterio di ricerca è alla ricerca di stringhe di uno spazio o di più.

Se sostituiamo un unico spazio per una qualsiasi sequenza di spazi multipli, ti restituisce il file di spaziatura regolare, con uno spazio tra ogni parola. Questo sarà anche sostituire un singolo spazio per un unico spazio, in alcuni casi, ma questo non influisce in alcun modo negativamente—ci sarà ancora ottenere il nostro risultato desiderato.

Se si digita il seguente e ridurre il pattern di ricerca in un unico spazio, vedrete subito perché dobbiamo includere due spazi:

sed -n ‘1,4 s/ */ /gp’ coleridge.txt

Perché l’asterisco corrisponde a zero o più caratteri precedenti, vede ogni carattere che non è uno spazio come “zero spazio” e si applica la sostituzione di esso.

Tuttavia, se si includono due spazi nella stringa di ricerca, sed deve trovare almeno un carattere di spazio, prima di applicare la sostituzione. Questo assicura caratteri diversi da spazi rimarranno intatte.

Abbiamo digitare il seguente, utilizzando l’opzione-e (espressione) che abbiamo usato in precedenza, che ci permette di effettuare due o più sostituzioni contemporaneamente:

sed -n -e ‘s/movimento/flutter/gip’ -e ‘s/oceano/tombino/gip’ coleridge.txt

Possiamo ottenere lo stesso risultato se si utilizza un punto e virgola (;) per separare le due espressioni, in questo modo:

sed -n ‘s/movimento/flutter/pil;s/oceano/tombino/gip’ coleridge.txt

Quando abbiamo scambiato “giorno” per la “settimana” nel comando riportato di seguito, l’istanza di “giorno” nell’espressione “un giorno” è stata scambiata così:

sed -n ‘s/[Dd]ay/settimana/gp’ coleridge.txt

Per evitare questo, si può solo cercare di sostituzioni su linee che corrispondono a un altro modello. Se si modifica il comando di un modello di ricerca all’inizio, vedremo di prendere in considerazione solo operativi sulle linee che corrispondono a quel modello.

Abbiamo digitare il seguente per rendere il nostro criterio di ricerca la parola “dopo”:

sed -n ‘/dopo/ s/[Dd]ay/settimana/gp’ coleridge.txt

Che ci dà la risposta che si desidera.

Sostituzioni Più Complesse

Diamo Coleridge una pausa e l’uso di sed per estrarre i nomi etc/passwd.

Ci sono metodi più rapidi per fare questo (più su che più tardi), ma useremo la strada più lunga, qui per dimostrare che un altro concetto. Ogni articolo abbinato a un modello di ricerca (chiamato sottoespressioni) può essere numerate (fino ad un massimo di nove elementi). È quindi possibile utilizzare questi numeri sed comandi riferimento specifico sottoespressioni.

È necessario racchiudere la sottoespressione in parentesi [()] per questo lavoro. La parentesi inoltre deve essere preceduto da una barra rovesciata () per impedire loro di essere trattato come un carattere normale.

Per effettuare questa operazione, digitare il seguente:

sed ‘s/([^:]*).*/1/’ /etc/passwd

Analizziamo questo:

  • sed ‘s/: sed comando e l’inizio della sostituzione di espressione.
  • (: La parentesi di apertura [(] allegando la parentetica, preceduto da una barra rovesciata ().
  • [^:]*: Il primo sottoespressione il termine di ricerca contiene un gruppo tra parentesi quadre. L’accento circonflesso (^) significa “non” quando viene utilizzato in un gruppo. Un gruppo significa qualsiasi carattere che non sia un segno di due punti (:) sarà accettata come una partita.
  • ): La parentesi di chiusura [)] con una barra rovesciata ().
  • .*: Questa seconda ricerca sottoespressione significa “qualsiasi carattere e un numero qualsiasi di loro.”
  • /1: La sostituzione di parte dell’espressione contiene 1 preceduti da una barra rovesciata (). Questo rappresenta il testo che corrisponde al primo sottoespressione.
  • /’: La chiusura di barra (/) e la virgoletta singola (‘) risolvere il comando sed.

Che cosa tutto questo significa è che stiamo andando a cercare una qualsiasi stringa di caratteri che non contiene i due punti (:), che sarà il primo esempio di testo corrispondente. Quindi, siamo alla ricerca di qualcos’altro che linea, che sarà la seconda istanza di testo corrispondente. Stiamo andando a sostituire l’intera linea con il testo che soddisfa il primo sottoespressione.

Ogni riga nel file /etc/passwd inizia con due punti terminata con il nome utente. Abbiniamo il tutto per i primi due punti, e quindi sostituire il valore per l’intera linea. Così, abbiamo isolato i nomi utente.

Avanti, vediamo racchiudere il secondo sottoespressione in parentesi [()] in modo che possiamo riferimento, in numero, come bene. Ci sarà anche sostituire 1 con 2. Il nostro comando sarà ora di sostituire l’intera linea con tutto, dai primi due punti (:) alla fine della riga.

Digitiamo il seguente:

sed ‘s/([^:]*)(.*)/2/’ /etc/passwd

Quelle piccole modifiche invertire il senso del comando, e si ottiene tutto, tranne il nome utente.

Ora, diamo un’occhiata al modo facile e veloce per fare questo.

Il nostro termine di ricerca da i primi due punti (:) alla fine della riga. Perché la nostra sostituzione di espressione è vuoto (//), non possiamo sostituire il testo corrispondente con nulla.

Così, abbiamo digitare il seguente, tagliando via tutto, dai primi due punti (:) alla fine della linea, lasciando solo i nomi:

sed ‘s/:.*//” /etc/passwd

Vediamo un esempio in cui siamo di riferimento il primo e il secondo corrisponde nello stesso comando.

Abbiamo un file di una virgola (,) per separare i nomi e i cognomi. Vogliamo li elenco come “cognome, nome”. Siamo in grado di utilizzare gatto, come mostrato di seguito, per vedere cosa c’è nel file:

gatto geeks.txt

Come un sacco di comandi di sed, la prossima potrebbe essere impenetrabile a prima:

sed ‘s/^(.*),(.*)$/2,1 /g’ geeks.txt

Questo è un comando di sostituzione, come gli altri, abbiamo utilizzato, e il criterio di ricerca è abbastanza facile. Staremo a rompere verso il basso al di sotto:

  • sed ‘s/: Il normale comando di sostituzione.
  • ^: Perché il punto di inserimento non è in un gruppo ([]), significa “All’inizio della riga.”
  • (.*),: Il primo sottoespressione è un numero qualsiasi di caratteri. È racchiuso in parentesi [()], ognuno dei quali è preceduto da una barra rovesciata () in modo che possiamo riferimento con il numero. Tutto il nostro modello di ricerca finora si traduce come la ricerca dall’inizio della linea fino alla prima virgola (,) per un numero qualsiasi di caratteri.
  • (.*): La prossima sottoespressione è (di nuovo) qualsiasi numero di caratteri. È anche racchiuso in parentesi [()], entrambi i quali sono preceduti da una barra rovesciata () in modo che possiamo di riferimento il testo di corrispondenza con il numero.
  • $/: Il segno di dollaro ($) rappresenta la fine della linea e permetterà alla nostra ricerca, per proseguire fino alla fine della riga. Abbiamo utilizzato questo semplicemente per introdurre il segno del dollaro. Non abbiamo davvero bisogno è qui, come l’asterisco (*) sarebbe andato alla fine della riga in questo scenario. La barra (/) completa il modello di ricerca della sezione.
  • 2,1 /g’: Perché abbiamo chiuso i nostri due espressioni in parentesi, si può fare riferimento ad entrambi per il loro numero. Perché vogliamo invertire l’ordine, il tipo li come secondo match,prima partita. I numeri devono essere preceduti da una barra rovesciata ().
  • /g: Questo consente al nostro comando a lavorare a livello globale su ogni linea.
  • geeks.txt: Il file su cui stiamo lavorando.

È inoltre possibile utilizzare il comando Taglia (c), sostituire le intere righe che soddisfano il criterio di ricerca. Abbiamo digitare il seguente per la ricerca di una riga con la parola “collo”, e sostituirla con una nuova stringa di testo:

sed ‘/collo/c Intorno al mio polso era infilata’ coleridge.txt

La nuova linea viene ora visualizzata in fondo al nostro estratto.

L’inserimento di Linee di Testo e

Possiamo anche inserire nuove linee di testo e nelle nostre file. Per inserire nuove righe dopo corrispondenti a quelli, useremo il comando Append (un).

Ecco il file che si sta andando a lavorare con:

gatto geeks.txt

Ho numerato le linee per rendere questo un po ‘ più facile da seguire.

Abbiamo digitare il seguente di ricerca per le righe che contengono la parola “Lui” e inserire una nuova riga al di sotto di essi:

sed ‘/Ha/a –> Inserito!’ geeks.txt

Abbiamo digitare il seguente e includere il Comando Inserisci (i) per inserire la nuova riga al di sopra di quelli che contengono il testo corrispondente:

sed ‘/e del/i –> Inserito!’ geeks.txt

Siamo in grado di utilizzare la e commerciale (&), che rappresenta l’originale testo corrispondente, per aggiungere testo a una corrispondenza linea. 1 , 2, e così via, rappresentano la corrispondenza di sottoespressioni.

Per aggiungere del testo all’inizio di una riga, si usa un comando di sostituzione che corrisponde tutto sulla linea, combinato con la sostituzione di una clausola che combina il nostro nuovo testo con la linea originale.

Per fare tutto questo, basta digitare le seguenti:

sed ‘s/.*/–> Inserito &/’ geeks.txt

Basta digitare le seguenti, tra cui il comando G, che consentirà di aggiungere una riga vuota tra ogni riga:

sed ‘G’ geeks.txt

Se si desidera aggiungere due o più righe vuote, è possibile utilizzare G, G, G, G, G, e così via.

Eliminazione Di Linee

Il comando Elimina (d) cancella le linee che corrispondono a un modello di ricerca, o quelli indicati con i numeri di riga o intervalli.

Per esempio, per eliminare la terza linea, ci sarebbe tipo il seguente:

sed ‘3d’ geeks.txt

Per eliminare la gamma di linee di quattro o cinque, si digiti il seguente:

sed ‘4,5 d’ geeks.txt

Per eliminare le linee al di fuori di un intervallo, usiamo un punto esclamativo (!), come mostrato di seguito:

sed ‘6,7!d’ geeks.txt

Salvare Le Modifiche

Finora, tutti i nostri risultati hanno stampato la finestra del terminale, ma non abbiamo ancora salvato ovunque. Per rendere questi permanente, è possibile scrivere le modifiche al file originale o li reindirizza a una nuova.

Di sovrascrivere il file originale richiede una certa cautela. Se il tuo sed comando è errato, è possibile apportare alcune modifiche al file originale che sono difficili da cancellare.

Per un po ‘ di pace della mente, sed possibile creare una copia di backup del file originale prima di eseguire il suo comando.

È possibile utilizzare l’opzione (-i) per raccontare il sed per scrivere le modifiche al file originale, ma se si aggiunge un file di estensione, sed per eseguire il backup del file originale in una nuova. Avrà lo stesso nome del file originale, ma con una nuova estensione di file.

Per dimostrare, ti cerca per tutte le righe che contengono la parola “Lui” e li elimina. Ci sarà anche il backup dei nostri file originale di una nuova utilizzando il BAK estensione.

Per fare tutto questo, basta digitare le seguenti:

sed -i’.bak’ ‘/^.*Egli.*$/d’ geeks.txt

Abbiamo digitare il seguente per assicurarsi che il nostro file di backup è invariata:

gatto geek.txt.bak

Si può anche digitare il seguente per reindirizzare l’output in un file nuovo e ottenere un risultato simile:

sed -i’.bak’ ‘/^.*Egli.*$/d’ geeks.txt > new_geeks.txt

Usiamo gatto per confermare le modifiche sono state scritte per il nuovo file, come mostrato di seguito:

gatto new_geeks.txt

Avendo sed Tutti Che

Come probabilmente avete notato, anche questo breve primer su sed è abbastanza lunga. Ci sono un sacco di questo comando, e c’è anche di più si può fare con esso.

Speriamo, però, questi concetti di base hanno fornito una solida base su cui costruire, come si continua a saperne di più.

CONTINUA A LEGGERE

  • “5G Teorie del Complotto: La più pazza e-Mail che Abbiamo Ricevuto
  • “Come Spostare Scaricato Nintendo Interruttore di Giochi per Scheda microSD
  • “Che cosa è successo di Pavone Servizio di Streaming, e di che Cosa Si tratta?
  • “Come Utilizzare Zappy, una Nuova Schermata e Strumento di Annotazione per Mac
  • “I 5 Migliori Team Di Comunicazione Apps