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.
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
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 \ |
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' \ |
Cancella tutte le linee bianche iniziali |
sed -e :a -e '/\$/N; s/\\n//; ta' \ |
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/^ *\(.*\) *$/||/; |
script per convertire file CSV in bar-separati (funziona solo su alcuni tipi di CSV, con “s e virgole incorporate) |
sed ':a;s/\(^\|\)\(\+\)\ |
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; \ |
Sostituisci solo tra “from” e “until” |
sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \ |
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;\ |
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\ |
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\)/&\ |
Una sostituzione rev |
sed 10q file.txt |
Una sostituzione della testa |
sed -e :a -e '$q;N;11,$D;ba' \ |
Una sostituzione della coda |
sed '$!N; /^\(.*\)\n$/!P; D' \ |
Una sostituzione uniq |
sed '$!N; s/^\(.*\)\n$//;\ |
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;}'\ |
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'\ |
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 \ |
Auto-esplicativo |
sed -e '/^$/,/^END/s/hills/\ |
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@\(*\):\(*\):\(*\ |
Invertire l’ordine degli elementi nell’ultima riga di path.txt |
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}'\ |
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\}$/\ |
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 \ |
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' \ |
Delete all trailing blank lines |
sed -e :a -e '/\$/N; s/\\n//; ta' \ |
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/^ *\(.*\) *$/||/; |
sed script to convert CSV file to bar-separated (works only on some types of CSV, with embedded “s and commas) |
sed ':a;s/\(^\|\)\(\+\)\ |
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; \ |
Replace only between “from” and “until” |
sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \ |
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;\ |
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\ |
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\)/&\ |
A rev replacement |
sed 10q file.txt |
A head replacement |
sed -e :a -e '$q;N;11,$D;ba' \ |
A tail replacement |
sed '$!N; /^\(.*\)\n$/!P; D' \ |
A uniq replacement |
sed '$!N; s/^\(.*\)\n$//;\ |
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;}'\ |
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'\ |
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 \ |
Self-explanatory |
sed -e '/^$/,/^END/s/hills/\ |
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@\(*\):\(*\):\(*\ |
Reverse order of items in the last line of path.txt |
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}'\ |
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\}$/\ |
Align text flush right |
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e \ |
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.