Articles

Imparare i comandi di Linux: sed

Posted on

Benvenuti alla seconda parte della nostra serie, una parte che si concentrerà su sed, la versione GNU. Come vedrete, ci sono diverse varianti di sed, che è disponibile per un bel po’ di piattaforme, ma ci concentreremo sulle versioni 4.x di GNU sed. Molti di voi hanno già sentito parlare di sed e lo hanno già usato, principalmente come strumento di sostituzione. Ma questo è solo un segmento di ciò che sed può fare, e noi faremo del nostro meglio per mostrarvi il più possibile di ciò che potete fare con esso. Il nome sta per Stream EDitor, e qui “stream” può essere un file, una pipe o semplicemente stdin. Ci aspettiamo che abbiate una conoscenza di base di Linux e se avete già lavorato con le espressioni regolari o almeno sapete cos’è una regexp, tanto meglio. Non abbiamo lo spazio per un tutorial completo sulle espressioni regolari, quindi invece vi daremo solo un’idea di base e molti esempi di sed. Ci sono molti documenti che trattano l’argomento, e avremo anche qualche raccomandazione, come vedrete tra un minuto.

Installazione

Non c’è molto da dire qui, perché è probabile che tu abbia già installato sed, perché è usato in vari script di sistema e uno strumento inestimabile nella vita di un utente Linux che vuole essere efficiente. Potete testare quale versione avete digitando

 $ sed --version

Sul mio sistema, questo comando mi dice che ho installato GNU sed 4.2.1, più i link alla home page e altre cose utili. Il pacchetto si chiama semplicemente ‘sed’ indipendentemente dalla distribuzione, ma se Gentoo offre sed implicitamente, credo che questo significhi che potete stare tranquilli.

Concetti

Prima di andare avanti, riteniamo che sia importante precisare cosa fa esattamente sed, perché “editor di flussi” potrebbe non suonare troppi campanelli. sed prende il testo in ingresso, fa le operazioni specificate su ogni linea (se non diversamente specificato) e stampa il testo modificato. Le operazioni specificate possono essere append, insert, delete o substitute. Questo non è così semplice come può sembrare: siate avvertiti che ci sono un sacco di opzioni e combinazioni che possono rendere un comando sed piuttosto difficile da digerire. Quindi, se volete usare sed, vi raccomandiamo di imparare le basi delle regexps, e potrete prendere il resto man mano che andate avanti. Prima di iniziare il tutorial, vogliamo ringraziare Eric Pement e altri per l’ispirazione e per quello che ha fatto per tutti coloro che vogliono imparare e usare sed.

Cercasi Analista Sistemi Linux!
L’Istituto Geofisico UAF, sta cercando un analista di sistemi Linux con esperienza per unirsi al loro team di analisti e ingegneri di infrastrutture informatiche di ricerca. LOCATION: Fairbanks, Alaska, USA
APPLY NOW

Espressioni regolari

Come i comandi/script sed tendono a diventare criptici, riteniamo che i nostri lettori debbano capire i concetti di base invece di copiare e incollare alla cieca comandi di cui non conoscono il significato. Quando uno vuole capire cos’è una regexp, la parola chiave è “matching”. O ancora meglio, “pattern matching”. Per esempio, in un rapporto per il vostro dipartimento HR avete scritto il nome di Nick quando vi riferite all’architetto di rete. Ma Nick è andato avanti e John ha preso il suo posto, quindi ora dovete sostituire la parola Nick con John. Se il file si chiama report.txt, potreste fare

 $ cat report.txt | sed 's/Nick/John/g' > report_new.txt

Per default sed usa stdout, quindi potreste voler usare l’operatore di reindirizzamento della vostra shell, come nel nostro esempio qui sotto. Questo è un esempio molto semplice, ma abbiamo illustrato alcuni punti: facciamo corrispondere il pattern “Nick” e sostituiamo tutte le istanze con “John”. Notate che sed è case-sensitive, quindi fate attenzione e controllate il vostro file di output per vedere se tutte le sostituzioni sono state fatte. Quanto sopra avrebbe potuto essere scritto anche così:

 $ sed 's/Nick/John/g' report.txt > report_new.txt

OK, ma dove sono le espressioni regolari, vi chiederete? Beh, prima volevamo farvi bagnare i piedi con il concetto di corrispondenza e qui arriva la parte interessante.

Se non siete sicuri di aver scritto “nick” per errore invece di “Nick” e volete abbinare anche quello, potete usare sed ‘s/Nick|nick/John/g’. La barra verticale ha lo stesso significato che potreste sapere se avete usato C, cioè la vostra espressione corrisponderà a Nick o a nick. Come vedrete, la pipe può essere usata anche in altri modi, ma il suo significato rimarrà. Altri operatori ampiamente usati nelle regexp sono ‘?’, che corrisponde a zero o una istanza dell’elemento precedente (flavou?r corrisponderà a flavor e flavour), ‘*’ significa zero o più e ‘+’ corrisponde a uno o più elementi. ‘^’ corrisponde all’inizio della stringa, mentre ‘ Se siete utenti di vi(m), alcune di queste cose potrebbero sembrarvi familiari. Dopo tutto, queste utilità, insieme ad awk o C hanno le loro radici nei primi giorni di Unix. Non insisteremo più sull’argomento, poiché le cose diventeranno più semplici leggendo degli esempi, ma quello che dovreste sapere è che ci sono varie implementazioni delle regexp: POSIX, POSIX Extended, Perl o varie implementazioni di espressioni regolari fuzzy, garantite per farvi venire il mal di testa.

esempi sed

. linee commentate

Imparare il comando Linux sed con esempi
Sintassi comando Linux Descrizione comando Linux
sed 's/Nick/John/g' report.txt
Sostituisci ogni occorrenza di Nick con John nel report.txt
sed 's/Nick|nick/John/g' report.txt
Sostituisci ogni occorrenza di Nick o nick con John.
sed 's/^/ /' file.txt >file_new.txt
Aggiungi 8 spazi a sinistra del testo per una stampa più carina.
sed -n '/Of course/,/attention you \
pay/p' myfile

Visualizza solo un paragrafo, che inizia con “Of course”

e finisce con “attention you pay”

sed -n 12,18p file.txt
Mostra solo le righe 12-18 del file.txt
sed 12,18d file.txt
Mostra tutto il file.txt tranne le righe dalla 12 alla 18
sed G file.txt 
Spazio doppio del file.txt
sed -f script.sed file.txt
Scrivi tutti i comandi nello script.sed ed eseguirli
sed '5!s/ham/cheese/' file.txt
Sostituire il prosciutto con il formaggio nel file.txt tranne che nella 5a riga
sed '$d' file.txt
Cancellare l’ultima riga
sed '/\{3\}/p' file.txt
Stampa solo le linee con tre cifre consecutive
sed '/boom/!s/aaa/bb/' file.txt
A meno che non si trovi un boom, sostituire aaa con bb
sed '17,/disk/d' file.txt
Cancellare tutte le linee dalla linea 17 a ‘disk’
echo ONE TWO | sed "s/one/unos/I"

Sostituisce uno con unos in modo case-insensibile,

in modo da stampare “unos DUE”

sed 'G;G' file.txt
Triple-spazio un file
sed 's/.$//' file.txt
Un modo per sostituire dos2unix 🙂
sed 's/^*//' file.txt
Cancella tutti gli spazi davanti ad ogni riga del file.txt
sed 's/*$//' file.txt
Cancella tutti gli spazi alla fine di ogni riga del file.txt
sed 's/^*//;s/*$//' file.txt

Cancella tutti gli spazi davanti e alla fine di ogni riga

del file.txt

sed 's/foo/bar/' file.txt
Sostituisci foo con bar solo per la prima istanza in una riga.
sed 's/foo/bar/4' file.txt
Sostituisci pippo con bar solo per la quarta istanza in una linea.
sed 's/foo/bar/g' file.txt 
Sostituisci pippo con bar per tutte le istanze in una linea.
sed '/baz/s/foo/bar/g' file.txt
Solo se la linea contiene baz, sostituisce foo con bar
sed '/./,/^$/!d' file.txt
Elimina tutte le linee vuote consecutive tranne EOF
sed '/^$/N;/\n$/D' file.txt

Cancella tutte le linee bianche consecutive, ma permette

solo la prima riga vuota

sed '/./,$!d' file.txt
Elimina tutte le linee bianche iniziali
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' \
file.txt
Cancella tutte le linee bianche iniziali
sed -e :a -e '/\$/N; s/\\n//; ta' \
file.txt

Se un file finisce con un backslash, lo unisce al successivo (utile

per gli script di shell)

sed '/regex/,+5/expr/'
Match regex più le prossime 5 righe
sed '1~3d' file.txt
Cancella ogni terza riga, iniziando dalla prima
sed -n '2~5p' file.txt
Stampa ogni quinta riga iniziando dalla la seconda
sed 's/ick/John/g' report.txt

Un altro modo per scrivere qualche esempio sopra.

Puoi indovinare quale?

sed -n '/RE/{p;q;}' file.txt

Stampa solo la prima corrispondenza di

RE (espressione regolare)

sed '0,/RE/{//d;}' file.txt
Cancellare solo la prima corrispondenza
sed '0,/RE/s//to_that/' file.txt
Cambia solo la prima corrispondenza
sed 's/^*,/9999,/' file.csv
Cambia primo campo a 9999 in un file CSV
s/^ *\(.*\) *$/||/;
s/" *, */"|/g;
: loop
s/| *\(*\) *, */||/g;
s/| *, */||/g;
t loop
s/ *|/|/g;
s/| */|/g;
s/^|\(.*\)|$//;

script per convertire file CSV in bar-separati

(funziona solo su alcuni tipi di CSV,

con “s e virgole incorporate)

sed ':a;s/\(^\|\)\(\+\)\
(\{3\}\)/,/g;ta' file.txt
Cambia i numeri dal file.txt dal modulo 1234.56 a 1.234.56
sed -r "s/\<(reg|exp)+/\U&/g"
Converte qualsiasi parola che inizia con reg o exp in maiuscolo
sed '1,20 s/Johnson/White/g' file.txt

Fare la sostituzione di Johnson con White solo su

linee tra 1 e 20

sed '1,20 !s/Johnson/White/g' file.txt
Il precedente invertito (abbinare tutti tranne le linee 1-20)
sed '/from/,/until/ { s/\<red\>/magenta/g; \
s/\<blue\>/cyan/g; }' file.txt
Sostituisci solo tra “from” e “until”
sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \
s/Kraft/Ebbing/g; }' file.txt
Sostituisci solo dalla parola “ENDNOTES:” fino a EOF
sed '/./{H;$!d;};x;/regex/!d' file.txt
Stampa i paragrafi solo se contengono regex
 sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;\
/RE2/!d;/RE3/!d' file.txt

Stampa i paragrafi solo se contengono RE1,

RE2 e RE3

 sed ':a; /\$/N; s/\\n//; ta' file.txt

Unisci due righe nella prima finisce con un backslash

 sed 's/14"/fourteen inches/g' file.txt

Ecco come potete usare i doppi apici

 sed 's/\/some\/UNIX\/path/\/a\/new\
/path/g' file.txt

Lavoro con i percorsi Unix percorsi

 sed 's///g' file.txt

Rimuovere tutti i caratteri da a a g dal file.txt

sed 's/\(.*\)foo/bar/' file.txt
Sostituisci solo l’ultima corrispondenza di foo con bar
sed '1!G;h;$!d' 
Una sostituzione tac
sed '/\n/!G;s/\(.\)\(.*\n\)/&\
/;//D;s/.//'
Una sostituzione rev
sed 10q file.txt
Una sostituzione della testa
sed -e :a -e '$q;N;11,$D;ba' \
file.txt
Una sostituzione della coda
sed '$!N; /^\(.*\)\n$/!P; D' \
file.txt
Una sostituzione uniq
sed '$!N; s/^\(.*\)\n$//;\
t; D' file.txt
Il contrario (o uniq -d equivalente)
sed '$!N;$!D' file.txt
Equivalente a coda -n 2
sed -n '$p' file.txt
… tail -n 1 (o tail -1)
sed '/regexp/!d' file.txt
grep equivalente
sed -n '/regexp/{g;1!p;};h' file.txt

Stampa la riga prima di quella che corrisponde alla regexp, ma

non quella che contiene la regexp

sed -n '/regexp/{n;p;}' file.txt
Stampa la linea dopo quella corrispondente alla regexp, ma

non quella che contiene la regexp

sed '/pattern/d' file.txt
Cancella le righe che corrispondono allo schema
sed '/./!d' file.txt
Cancella tutte le righe vuote da un file
sed '/^$/N;/\n$/N;//D' file.txt

Cancellare tutte le righe vuote consecutive

eccetto le prime due

sed -n '/^$/{p;h;};/./{x;/./p;}'\
file.txt
Cancellare l’ultima riga di ogni paragrafo
sed 's/.\x08//g' file
Rimuovi nroff overstrikes
sed '/^$/q'
Ottieni l’intestazione della posta
sed '1,/^$/d'
Ottieni corpo della mail
sed '/^Subject: */!d; s///;q'
Ricevi oggetto della mail
sed 's/^/> /'

Quote messaggio di posta inserendo un

“> ” davanti ad ogni riga

sed 's/^> //'
Il contrario (messaggio di posta non quotato)
sed -e :a -e 's/<*>//g;/</N;//ba'
Rimuovi tag HTML
sed '/./{H;d;};x;s/\n/={NL}=/g'\
file.txt | sort \
| sed '1s/={NL}=//;s/={NL}=/\n/g'
Ordina i paragrafi del file.txt in ordine alfabetico
sed 's@/usr/bin@&/local@g' path.txt
Sostituisci /usr/bin con /usr/bin/local nel percorso.txt
sed 's@^.*$@<<<&>>>@g' path.txt
Provare e vedere:)
sed 's/\(\/*\).*//g' path.txt

Percorso fornito.txt contiene $PATH, questo

Ecco solo il primo percorso su ogni linea

sed 's/\(*\).*//' /etc/passwd

sostituzioneawk – visualizza solo gli utenti

dal file passwd

echo "Welcome To The Geek Stuff" | sed \
's/\(\b\)/\(\)/g'
(W)elcome (T)o (T)he (G)eek (S)tuff
Auto-esplicativo
sed -e '/^$/,/^END/s/hills/\
mountains/g' file.txt

Sostituisci “colline” con “montagne”, ma solo su blocchi

di testo che iniziano

con una riga vuota, e terminano con una riga che inizia

con i tre caratteri ‘END’, inclusi

sed -e '/^#/d' /etc/services | more
Visualizza il file dei servizi senza le linee commentate
sed '$s@\(*\):\(*\):\(*\
\)@::@g' path.txt
Invertire l’ordine degli elementi nell’ultima riga di path.txt
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}'\
-e h file.txt

Stampa 1 riga di contesto prima e dopo la riga corrispondente,

con un numero di linea dove si verifica la corrispondenza

sed '/regex/{x;p;x;}' file.txt
Inserisci una nuova riga sopra ogni riga che corrisponde alla regex
sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt
Match AAA, BBB e CCC in qualsiasi ordine
sed '/AAA.*BBB.*CCC/!d' file.txt
Match AAA, BBB e CCC in quest’ordine
sed -n '/^.\{65\}/p' file.txt
Stampa righe lunghe 65 caratteri o più
sed -n '/^.\{65\}/!p' file.txt
Stampa righe lunghe 65 caratteri o meno
sottoposto al file '/regex/G'.txt
Inserire una riga vuota sotto ogni riga
sed '/regex/{x;p;x;G;}' file.txt
Inserisci una linea bianca sopra e sotto
sed = file.txt | sed 'N;s/\n/\t/'
Numero linee in file.txt
sed -e :a -e 's/^.\{1,78\}$/\
&/;ta' file.txt
Allinea il testo a filo di destra
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e \br>'s/\( *\)//' file.txt
Allinea il testo al centro

Conclusione

Questo è solo una parte di ciò che si può dire su sed, ma questa serie è intesa come una guida pratica, quindi speriamo che vi aiuti a scoprire la potenza degli strumenti Unix e a diventare più efficienti nel vostro lavoro.

fa il contrario. If you’re a vi(m) user, some of these things might look familiar. After all, these utilities, together with awk or C have their roots in the early days of Unix. We won’t insist anymore on the subject, as things will become simpler by reading examples, but what you should know is that there are various implementations of regexps: POSIX, POSIX Extended, Perl or various implementations of fuzzy regular expressions, guaranteed to give you a headache.

sed examples

Learning Linux sed command with examples
Linux command syntax Linux command description
sed 's/Nick/John/g' report.txt
Replace every occurrence of Nick with John in report.txt
sed 's/Nick|nick/John/g' report.txt
Replace every occurrence of Nick or nick with John.
sed 's/^/ /' file.txt >file_new.txt
Add 8 spaces to the left of a text for pretty printing.
sed -n '/Of course/,/attention you \
pay/p' myfile

Display only one paragraph, starting with “Of course”

and ending in “attention you pay”

sed -n 12,18p file.txt
Show only lines 12-18 of file.txt
sed 12,18d file.txt
Show all of file.txt except for lines from 12 to 18
sed G file.txt 
Double-space file.txt
sed -f script.sed file.txt
Write all commands in script.sed and execute them
sed '5!s/ham/cheese/' file.txt
Replace ham with cheese in file.txt except in the 5th line
sed '$d' file.txt
Delete the last line
sed '/\{3\}/p' file.txt
Print only lines with three consecutive digits
sed '/boom/!s/aaa/bb/' file.txt
Unless boom is found replace aaa with bb
sed '17,/disk/d' file.txt
Delete all lines from line 17 to ‘disk’
echo ONE TWO | sed "s/one/unos/I"

Replaces one with unos in a case-insensitive manner,

so it will print “unos TWO”

sed 'G;G' file.txt
Triple-space a file
sed 's/.$//' file.txt
A way to replace dos2unix 🙂
sed 's/^*//' file.txt
Delete all spaces in front of every line of file.txt
sed 's/*$//' file.txt
Delete all spaces at the end of every line of file.txt
sed 's/^*//;s/*$//' file.txt

Delete all spaces in front and at the end of every line

of file.txt

sed 's/foo/bar/' file.txt
Replace foo with bar only for the first instance in a line.
sed 's/foo/bar/4' file.txt
Replace foo with bar only for the 4th instance in a line.
sed 's/foo/bar/g' file.txt 
Replace foo with bar for all instances in a line.
sed '/baz/s/foo/bar/g' file.txt
Only if line contains baz, substitute foo with bar
sed '/./,/^$/!d' file.txt
Delete all consecutive blank lines except for EOF
sed '/^$/N;/\n$/D' file.txt

Delete all consecutive blank lines, but allows

only top blank line

sed '/./,$!d' file.txt
Delete all leading blank lines
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' \
file.txt
Delete all trailing blank lines
sed -e :a -e '/\$/N; s/\\n//; ta' \
file.txt

If a file ends in a backslash, join it with the next (useful

for shell scripts)

sed '/regex/,+5/expr/'
Match regex plus the next 5 lines
sed '1~3d' file.txt
Delete every third line, starting with the first
sed -n '2~5p' file.txt
Print every 5th line starting with the second
sed 's/ick/John/g' report.txt

Another way to write some example above.

Can you guess which one?

sed -n '/RE/{p;q;}' file.txt

Print only the first match of

RE (regular expression)

sed '0,/RE/{//d;}' file.txt
Delete only the first match
sed '0,/RE/s//to_that/' file.txt
Change only the first match
sed 's/^*,/9999,/' file.csv
Change first field to 9999 in a CSV file
s/^ *\(.*\) *$/||/;
s/" *, */"|/g;
: loop
s/| *\(*\) *, */||/g;
s/| *, */||/g;
t loop
s/ *|/|/g;
s/| */|/g;
s/^|\(.*\)|$//;

sed script to convert CSV file to bar-separated

(works only on some types of CSV,

with embedded “s and commas)

sed ':a;s/\(^\|\)\(\+\)\
(\{3\}\)/,/g;ta' file.txt
Change numbers from file.txt from 1234.56 form to 1.234.56
sed -r "s/\<(reg|exp)+/\U&/g"
Convert any word starting with reg or exp to uppercase
sed '1,20 s/Johnson/White/g' file.txt

Do replacement of Johnson with White only on

lines between 1 and 20

sed '1,20 !s/Johnson/White/g' file.txt
The above reversed (match all except lines 1-20)
sed '/from/,/until/ { s/\<red\>/magenta/g; \
s/\<blue\>/cyan/g; }' file.txt
Replace only between “from” and “until”
sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \
s/Kraft/Ebbing/g; }' file.txt
Replace only from the word “ENDNOTES:” until EOF
sed '/./{H;$!d;};x;/regex/!d' file.txt
Print paragraphs only if they contain regex
 sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;\
/RE2/!d;/RE3/!d' file.txt

Print paragraphs only if they contain RE1,

RE2 and RE3

 sed ':a; /\$/N; s/\\n//; ta' file.txt

Join two lines in the first ends in a backslash

 sed 's/14"/fourteen inches/g' file.txt

This is how you can use double quotes

 sed 's/\/some\/UNIX\/path/\/a\/new\
/path/g' file.txt

Working with Unix paths

 sed 's///g' file.txt

Remove all characters from a to g from file.txt

sed 's/\(.*\)foo/bar/' file.txt
Replace only the last match of foo with bar
sed '1!G;h;$!d' 
A tac replacement
sed '/\n/!G;s/\(.\)\(.*\n\)/&\
/;//D;s/.//'
A rev replacement
sed 10q file.txt
A head replacement
sed -e :a -e '$q;N;11,$D;ba' \
file.txt
A tail replacement
sed '$!N; /^\(.*\)\n$/!P; D' \
file.txt
A uniq replacement
sed '$!N; s/^\(.*\)\n$//;\
t; D' file.txt
The opposite (or uniq -d equivalent)
sed '$!N;$!D' file.txt
Equivalent to tail -n 2
sed -n '$p' file.txt
… tail -n 1 (or tail -1)
sed '/regexp/!d' file.txt
grep equivalent
sed -n '/regexp/{g;1!p;};h' file.txt

Print the line before the one matching regexp, but

not the one containing the regexp

sed -n '/regexp/{n;p;}' file.txt
Print the line after the one matching the regexp, but

not the one containing the regexp

sed '/pattern/d' file.txt
Delete lines matching pattern
sed '/./!d' file.txt
Delete all blank lines from a file
sed '/^$/N;/\n$/N;//D' file.txt

Delete all consecutive blank lines

except for the first two

sed -n '/^$/{p;h;};/./{x;/./p;}'\
file.txt
Delete the last line of each paragraph
sed 's/.\x08//g' file
Remove nroff overstrikes
sed '/^$/q'
Get mail header
sed '1,/^$/d'
Get mail body
sed '/^Subject: */!d; s///;q'
Get mail subject
sed 's/^/> /'

Quote mail message by inserting a

“> ” in front of every line

sed 's/^> //'
The opposite (unquote mail message)
sed -e :a -e 's/<*>//g;/</N;//ba'
Remove HTML tags
sed '/./{H;d;};x;s/\n/={NL}=/g'\
file.txt | sort \
| sed '1s/={NL}=//;s/={NL}=/\n/g'
Sort paragraphs of file.txt alphabetically
sed 's@/usr/bin@&/local@g' path.txt
Replace /usr/bin with /usr/bin/local in path.txt
sed 's@^.*$@<<<&>>>@g' path.txt
Try it and see 🙂
sed 's/\(\/*\).*//g' path.txt

Provided path.txt contains $PATH, this will

echo only the first path on each line

sed 's/\(*\).*//' /etc/passwd

awk replacement – displays only the users

from the passwd file

echo "Welcome To The Geek Stuff" | sed \
's/\(\b\)/\(\)/g'
(W)elcome (T)o (T)he (G)eek (S)tuff
Self-explanatory
sed -e '/^$/,/^END/s/hills/\
mountains/g' file.txt

Swap ‘hills’ for ‘mountains’, but only on blocks

of text beginning

with a blank line, and ending with a line beginning

with the three characters ‘END’, inclusive

sed -e '/^#/d' /etc/services | more
View the services file without the commented lines
sed '$s@\(*\):\(*\):\(*\
\)@::@g' path.txt
Reverse order of items in the last line of path.txt
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}'\
-e h file.txt

Print 1 line of context before and after the line matching,

with a line number where the matching occurs

sed '/regex/{x;p;x;}' file.txt
Insert a new line above every line matching regex
sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt
Match AAA, BBB and CCC in any order
sed '/AAA.*BBB.*CCC/!d' file.txt
Match AAA, BBB and CCC in that order
sed -n '/^.\{65\}/p' file.txt
Print lines 65 chars long or more
sed -n '/^.\{65\}/!p' file.txt
Print lines 65 chars long or less
sed '/regex/G' file.txt
Insert blank line below every line
sed '/regex/{x;p;x;G;}' file.txt
Insert blank line above and below
sed = file.txt | sed 'N;s/\n/\t/'
Number lines in file.txt
sed -e :a -e 's/^.\{1,78\}$/\
&/;ta' file.txt
Align text flush right
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e \
's/\( *\)//' file.txt
Align text center

Conclusion

This is only a part of what can be told about sed, but this series is meant as a practical guide, so we hope it helps you discover the power of Unix tools and become more efficient in your work.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *