sed

Esempi di Bash Sed

Esempi di Bash Sed
Bash ti consente di eseguire la sostituzione del modello usando l'espansione variabile come ($var/pattern/replacement). E quindi, sed in questo modo (sed -e 's/pattern/replacement/'). Tuttavia, c'è di più da sed che sostituire i modelli nei file di testo.  Qui riscopriremo sed, per esempio, con comandi e flussi di lavoro equivalenti per aiutare nelle attività quotidiane.

Configurazione per esempi sed

Ecco una guida rapida per prepararsi all'esempio, che cercherò di non esagerare.

"parole" è un file di testo contenente i numeri da 1 a 100. Se non sei sicuro del comando per crearlo, vedi Funzione di esportazione per xargs in Bash Export Command. Non sai mai che potrebbe essere nella tua prossima intervista di scripting di shell.

"bar" è un file di testo contenente una singola riga -.

"old-php" è un file di testo contenente righe del vecchio PHP che si interromperà in php7 o successivo. (Suggerimento: ereg)

Si noti che tutte le funzioni descritte sopra possono essere trovate di seguito in Nota finale sulle funzioni per l'impostazione.

Esempi di Sed con comandi equivalenti

In un ambiente a riga di comando, scoprirai che esiste più di una soluzione per un determinato compito. Tuttavia, per la maggior parte, vuoi seguire il percorso che presenta la minor resistenza. Ecco un elenco di esempi di comandi sed con corrispondenti comandi equivalenti, di cui alcuni saranno trattati in dettaglio di seguito.

1. Stampa una riga casuale (equivalente a sort -R - | head -1)

sed -n "$(( RANDOM % 100 ))p" -

2.Stampa l'ultima riga del file (equivalente a head -1 -)

sed -n '$p' -

3. Stampa le prime 10 righe di un file (equivalente a head -n 10 -)

sed '10q' -

4. Stampa la prima riga di un file (equivalente a tail -1 -)

sed -n '1p' -

5. Elimina tutte le istanze di un carattere (equivalente a tr -delete '0' -, dove 0 è il carattere che vogliamo eliminare)

sed -e 's/0//g' -

6. Converti file csv in tsv (equivalente a tr ',"\t' -)

sed -e 's/,/\t/g' -

7.Aggiungi riga al file (equivalente a cat bar -)

sed '$a ---' -

8. Anteponi riga al file (equivalente a cat - bar)

sed '1i ---' -

9. Stampa tutte le righe del file (equivalente a cat -)

sed -n -e 'p' -

10. Stampa una linea che corrisponde a un motivo (equivalente a grep -e '^1' -)

sed -n -e '/^1/ p' -

11. Elimina le righe che corrispondono a un modello (equivalente a grep -v -e '^1' -)

sed -e '/^1/ d' -

12. Ottieni il numero di righe in un file (equivalente a wc -l -)

sed -n -e '$=' -

13. Scrivi su un file in background (tee di comando equivalente)

sed "w $1" -

Esempio di utilizzo di sed per implementare il comando tee

Proprio sopra, c'è un esempio etichettato Scrivi su un file in background. Tipo di suoni come il comando tee. Bene, lo è. Qui approfondiremo come implementare una funzione per sostituire tee in bash usando sed.

Comandi

maglietta ()

prova $# -eq 1 || ritorno;
sed "w $1" -

principale ()

seq 10 | tee dieci;
gatto dieci

principale

Produzione

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Qui vedrai due elenchi degli interi da 1 a 10. Il primo è dal comando seq. Il secondo che otteniamo dal gatto del file scritto in tee. So che è ridicolo ma funziona!

Esempio di utilizzo di sed per stampare una riga casuale in un file

Supponiamo di voler stampare una riga casuale in un file usando bash e un po' di sed. Possiamo farlo? Sì possiamo! Ecco come.

Implementa una funzione che

  1. Ottiene il numero di righe in un file, L
  2. Genera un numero casuale compreso tra 1 e L, R
  3. Stampe R

La funzione si aspetta che l'input venga convogliato dall'esterno.

Comandi

qualche riga ()

funzione lc()

sed -n -e '$=' -
;
funzione print-line()

sed -n -e "$1p" -
;
temp=$( mktemp );
gatto -> $temp;
gatto $temp | print-line $(( RANDOM % $( cat $temp | lc ) + 1 ));
rm $temp

Esempio di utilizzo (1)

seq 100 | _

Uscita (1)

35

Esempio di utilizzo (2)

ricciolo https://linuxhint.com/bash_cut_command/ --silent | strip-tag | qualche riga

Guarda l'esempio sotto, usando sed per rimuovere i tag HTML. Nota che l'esempio sopra a volte restituisce vuoto per le righe vuote. Come esercizio, può essere migliorato.

Utilizzo di sed per stampare le righe in un file

Supponiamo di voler implementare una funzione in bash per stampare una determinata riga in un file. Cercare di stampare una singola riga in un file usando un ciclo in bash, head, tail o awk è troppo complicato per stampare righe in un file. Meno male che abbiamo sed. La funzione risultante utilizzando sed sarebbe la seguente.

Comandi

linea di stampa ()

sed -n "$1p" -

Ora vediamo cosa succede quando usiamo print-line sulle parole.

Comandi

parole | linea di stampa 50

Produzione

50

Va bene. Sembra buono ma proviamo qualcosa che sembra un po' meno banale.

Comandi

dichiarare -xf parolef
dichiarare -xf print-line
seq 1 10 $( parole | wc -l ) | xargs -i  bash -c "parole | print-line "

Produzione

1
11
21
31
41
51
61
71
81
91

Va bene. Ora è più così! Vedi come sed può essere usato in uno script bash per stampare qualsiasi riga in un file.

Esempi di Sed senza comandi equivalenti

In un ambiente a riga di comando, a volte il percorso verso una soluzione che presenta la minima resistenza è il modo sed; altrimenti, finisci per fare più lavoro del necessario in primo luogo. Alcuni comandi potrebbero essere presenti di seguito.

Comanda tutte le righe in uno script di shell

sed -e 's/^/#/' -
Elimina la prima riga
sed -e '1d' -
Elimina l'ultima riga
sed -e '$ d' -
Inserisci una linea prima delle linee che corrispondono a un motivo
sed '/0$/i ---' -
Inserisci una linea dopo le linee che corrispondono a un motivo
sed '/0$/ ---' -
Elimina i tag html
sed -e 's/<[^>]*.//g' -
Aggiorna ereg nel vecchio codice php per eseguirlo in php7 o successivo
sed 's/ereg(\([^,]*\).\([^)]*\)./strpos(\2,\1)/g'
Controlla se sed è precedente a una certa versione
sed -e 'v 4.5' -

Esempio di ramificazione della versione sed in bash

Sopra negli esempi, c'è una riga per verificare se sed è precedente a una determinata versione che possiamo usare per implementare il branching della versione in bash, che credo sia più facile che provare a implementare una funzione per confrontare i numeri di versione dall'output di sed -version. L'unico problema è che se esiste una versione precedente di sed che non supporta il comando v, allora siamo nei guai.

Comandi

test-sed-version-at-most()
echo -n | sed "v $1" - 2>/dev/null

versione di prova ()

echo -n "Versione $1. Va bene. Fallo il ";
prova-sed-versione-al-massimo $1 &&
echo -n "vecchio";
vero
||
echo -n "nuovo"
;
eco "modo."

principale ()

locale v;
per v in 4.4,5;
fare
prova la versione $v;
fatto

principale

Produzione

Versione 4.4. Va bene. Fallo alla vecchia maniera.
Versione 4.5. Va bene. Fallo nel modo nuovo.

Nota che la versione di sed in esecuzione sulla mia macchina al momento della digitazione di questi caratteri è 4.4, che spiegherebbe l'output sopra. Inoltre, allo stesso tempo, l'ultima versione di gnu sed era 4.7, circa 3 anni in più di quello che ho io. Il mio sed è vecchio! Infatti, in sed 4.0.6, è stato aggiunto un parametro al comando version quindi questa strategia funziona per qualsiasi detto almeno v4.0.6, che è indulgente considerando che la versione è stata rilasciata all'inizio del 2003. Sei bravo.

Ho fatto qualche ricerca in più, in realtà NEWS leggendo l'ultimo codice sorgente. Versione 4.6 ha una nuova funzionalità, -debug che scarica lo script e annota le righe di output. Ciò ti consentirebbe di tradurre gli script sed generati dalle funzioni in bash in forma canonica. Freddo! Non dimenticare che hai bisogno di ramificare la versione di sed in bash. È qui che entra in gioco questo esempio sed.

Esempio di funzione bash che usa sed per rimuovere i tag HTML

Negli esempi sopra c'è una riga per rimuovere i tag HTML. Mettiamolo in una funzione bash e usiamola per eliminare tutti i tag HTML dall'ultimo articolo che ho scritto.

Comandi

cartellini ()

sed -e 's/<[^>]*.//g' -

ricciolo https://linuxhint.com/bash_cut_command/ --silent | strip-tag

Non posso dire che sia perfetto ma almeno è leggibile da terminale.

Esempi di Sed con flussi di lavoro: Flusso di lavoro di esempio: sostituisci tutto in modo sicuro utilizzando find, grep e sed

È sicuro dire che le modifiche apportate utilizzando sed con l'opzione -i sono irreversibili. A meno che tu non sia completamente sicuro di quale testo debba essere sostituito, è probabile che ti ritroverai con un carattere in meno del previsto. Ecco perché in questo esempio useremo sed in un flusso di lavoro per sostituire in modo sicuro il testo in tutti i file selezionati.

Flusso di lavoro

  1. trova
  2. grep
  3. sed
trova

Qui selezionerai i file da sostituire. Suggerisco di utilizzare un comando in questo modo:

trova -tipo f -nome | grep -v -e | xargs -i …

Ad esempio, potresti voler limitare i file per sostituire i file PHP escludendo le directory del repository git come segue.

trova -tipo f -nome \*.php | grep -v -e '.git' | xargs -i…

Maggiori informazioni sul comando xargs in bash.

grep

Successivamente, proveremo ad abbinare some_pattern nei file selezionati come segue. Nota che poiché stiamo usando l'opzione -o per grep, l'output mostrerà solo la stringa corrispondente, se presente.

trova -tipo f -nome \*.php | grep -v -e '.git' |
xargs -i grep -e some_pattern -o

Il comando sopra dovrebbe restituire un elenco di stringhe che corrispondono a some_pattern.

sed

Infine, vogliamo sostituire tutte le stringhe che corrispondono a some_pattern. Per farlo dobbiamo convertire grep in sed come segue.

trova -tipo f -nome \*.php | grep -v -e '.git' |
xargs -i sed -i -e s/some_pattern/replacement/g

Il comando grep diventa sed -i e l'opzione -o viene rimossa. E il gioco è fatto.

Ora puoi controllare in anticipo quali stringhe verranno sostituite in sed invece di mettere alla prova la tua fortuna.

Note finali sulle opzioni usate negli esempi

Ecco un elenco di opzioni utilizzate negli esempi sed discussi brevemente.

Opzione Descrizione
-io Modifica sul posto. Se l'input è un file (non reindirizzato) il risultato delle espressioni sovrascriverà il contenuto del file.

Sed ne accetta uno

ad es.) sed -n…

-e -e sta per espressione. Il suo parametro è un'espressione nel linguaggio sed.

Sed ne accetta molti

es.) sed -e 'espr1' -e 'espr2'…

-n Nasconde la linea non influenzata dall'espressione. Cioè se l'espressione è un'istruzione print nel linguaggio sed, le righe non incluse nell'istruzione print non saranno incluse nell'output.

ad es.) sed -n…

Per ulteriori informazioni sulle opzioni di sed disponibili, vedere sed -help

Note finali sui comandi equivalenti usati negli esempi

Le seguenti utilità della riga di comando sono incluse negli esempi di sed con comandi equivalenti.

Nota finale sul finale - nell'esempio comandi equivalenti

Nel caso ti stia chiedendo cosa sta succedendo al carattere - nell'esempio, questa nota è per te. Ho aggiunto un carattere - dopo la maggior parte dei comandi negli esempi per suggerire che ci aspettiamo che l'input venga ricevuto tramite una pipe. Questo è,

gatto qualche file | sort -R - | testa -1

Tuttavia, quando il comando a sinistra è presente la pipe, possiamo omettere il suggerimento come segue.

gatto qualche file | sort -R | testa -1

Questo è quello che stava succedendo con il carattere - dopo i comandi negli esempi.

Note finali sulle funzioni per la configurazione

Nel caso tu stia cercando, ecco le funzioni per l'impostazione per gli esempi sopra. L'output ottenuto usandodichiarare -f. Maggiori informazioni sul comando di dichiarazione in bash per ulteriori utilizzi.

Comandi

parole ()

segue 100

barra ()

eco ---

vecchio-php ()

echo 'ereg($UA,"Bottybot")'

Linea di fondo

Mi è piaciuto scrivere esempi sed di Bash e ho anche raccolto alcuni trucchi extra lungo la strada. Sed è una potente utility da riga di comando e un linguaggio espressivo per manipolare file di testo. Se ti è piaciuto conoscere sed, non preoccuparti, c'è ancora molto da toccare. Sed su.

Il tasto sinistro del mouse non funziona su Windows 10
Se stai utilizzando un mouse dedicato con il tuo laptop o computer desktop ma il il tasto sinistro del mouse non funziona su Windows 10/8/7 per qualch...
Il cursore salta o si sposta in modo casuale durante la digitazione in Windows 10
Se scopri che il cursore del mouse salta o si sposta da solo, automaticamente, in modo casuale durante la digitazione nel laptop o nel computer Window...
Come invertire la direzione di scorrimento del mouse e dei touchpad in Windows 10
Topo e Touchpads non solo rende l'elaborazione semplice, ma anche più efficiente e richiede meno tempo. Non possiamo immaginare una vita senza questi ...