Exemples de Bash Sed

Bash Sed Examples



Bash us permet substituir patrons mitjançant una expansió variable com ($ {var / pattern / replacement}). I així, sed és així (sed -e ‘s / pattern / replacement /’). Tot i això, hi ha més coses que sed que substituir patrons als fitxers de text. Aquí redescobrirem sed, per exemple, amb ordres i fluxos de treball equivalents per ajudar-vos en les tasques del dia a dia.

Configuració d'exemples sed

Aquí teniu una guia ràpida per configurar l'exemple, que intentaré que no exageri massa.







paraulesés un fitxer de text que conté els números de l'1 al 100. Si no esteu segur de l'ordre per crear-lo, consulteu la funció Exportar xargs a l'ordre d'exportació de Bash. Mai se sap que pot ser a la propera entrevista de guió de shell.



barraés un fitxer de text que conté una sola línia -.



vell-phpés un fitxer de text que conté línies de PHP antic que es trencaran en php7 o posterior. (Consell: ereg)





Tingueu en compte que totes les funcions descrites anteriorment es poden trobar a continuació a la nota final sobre funcions per configurar.

Exemples Sed amb ordres equivalents

En un entorn de línia d'ordres, trobareu que hi ha més d'una solució a una tasca determinada. Tanmateix, en la seva major part, voleu seguir el camí que menys resistència genera. A continuació es mostra una llista d’exemples d’ordres sed amb les ordres equivalents corresponents, on algunes es detallaran a continuació.



1. Imprimiu una línia aleatòria (equivalent a ordena -R - | cap -1)

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

2. Imprimiu l'última línia del fitxer (equivalent al cap -1 -)

sed -n '$ p'-

3. Imprimiu les primeres 10 línies d'un fitxer (equivalent al cap -n 10 -)

sed '10q'-

4. Imprimiu la primera línia d'un fitxer (equivalent a la cua -1 -)

sed -n '1p'-

5. Suprimiu totes les instàncies d’un caràcter (equivalent a tr –elimina ‘0’ -, on 0 és el caràcter que volem suprimir)

sed -I 's / 0 // g'-

6. Converteix el fitxer CSV a tsv (equivalent a tr ',' ' t' -)

sed -I 's /, / t / g'-

7. Afegiu una línia al fitxer (equivalent a la barra de gats -)

sed '$ A ---'-

8. Prepara la línia al fitxer (equivalent a cat-bar)

sed '1i ---'-

9. Imprimiu totes les línies del fitxer (equivalent a cat -)

sed -n -I 'p'-

10. Imprimiu una línia que coincideixi amb un patró (equivalent a grep -e '^ 1' -)

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

11. Suprimiu les línies que coincideixin amb un patró (equivalent a grep -v -e '^ 1' -)

sed -I '/ ^ 1 / d'-

12. Obteniu el nombre de línies d'un fitxer (equivalent a wc -l -)

sed -n -I '$ ='-

13. Escriviu a un fitxer en segon pla (te de comandament equivalent)

sed 'dins$ {1}'-

Exemple d'ús de sed per implementar l'ordre tee

Just a sobre, hi ha un exemple amb el nom Escriu en un fitxer al fons. Una mena de sons com l’ordre tee. Bé, és així. Aquí ampliarem com implementar una funció per substituir el tee a bash mitjançant sed.

Ordres

tee ()
{
prova $ {#} -eq 1 || tornar;
sed 'dins$ {1}'-
}
principal()
teeaixò;
gataixò

principal

Sortida

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

Aquí veureu dos llistats dels enters de l'1 al 10. El primer és de l'ordre seq. El segon que obtenim del gat de la fitxa escrit en tee. Sé que és ridícul, però funciona!

Exemple d'ús de sed per imprimir una línia aleatòria en un fitxer

Suposem que volem imprimir una línia aleatòria en un fitxer amb bash i una mica de sed. Ho podem fer? Si podem! Així és com.

Implementar una funció que

  1. Obté el nombre de línies d'un fitxer, L
  2. Genera un nombre aleatori entre 1 i L, R
  3. Imprimeix R

La funció espera que l’entrada es canalitzi des de l’exterior.

Ordres

alguna línia()
{
funciólc()
{
sed -n -I '$ ='-
};
funciólínia d'impressió()
{
sed -n -I '$ {1}p '-
};
temp= $( mktemp );
gat-> $ {temp};
gat $ {temp} |línia d'impressió $((RANDOM%$( gat $ {temp} |lc)+1 ));
rm $ {temp}
}

Exemple d'ús (1)

seq 100 |_

Sortida (1)

35

Exemple d'ús (2)

arrissar https://linuxhint.com/bash_cut_command/ --silenciat |strip-tags|alguna línia

Vegeu l'exemple següent, amb sed per despullar etiquetes HTML. Tingueu en compte que l'exemple sobre de vegades torna en blanc per a les línies buides. Com a exercici, es pot millorar.

Mitjançant sed per imprimir línies en un fitxer

Suposem que voleu implementar una funció en bash per imprimir una línia determinada en un fitxer. Intentar imprimir una sola línia en un fitxer mitjançant un bucle en bash, head, tail o awk és massa feina per imprimir línies en un fitxer. Bona cosa que hem sed. La funció resultant amb sed seria la següent.

Ordres

línia d'impressió()
{
sed -n '$ {1}p '-
}

Ara vegem què passa quan fem servir la línia d’impressió de paraules.

Ordres

paraules|línia d'impressió50

Sortida

50

Bé. Es veu bé, però provem alguna cosa que sembli una mica menys trivial.

Ordres

declari -xfparaules
declari -xflínia d'impressió
seq 1 10$(paraules| wc -la ) | xargs-ibash -c 'paraules | línia d'impressió {} '

Sortida

1
11
21
31
41
51
61
71
81
91

Bé. Ara és més semblant! Veureu com es pot utilitzar sed en un script bash per imprimir qualsevol línia d’un fitxer.

Exemples Sed sense ordres equivalents

En un entorn de línia d'ordres, de vegades el camí cap a una solució que presenta menys resistència és el camí sed; en cas contrari, acabareu fent més feina de la necessària. Algunes ordres es poden mostrar a continuació.

Ordeneu totes les línies d'un script d'intèrpret d'ordres

sed -I 's / ^ / # /'-
Suprimeix la primera línia
sed -I '1d'-
Suprimeixúltimlínia
sed -I '$ d'-
Inseriu una línia abans de les línies que coincideixin amb un patró
sed '/ 0 $ / i ---'-
Inseriu una línia després de les línies que coincideixin amb un patró
sed '/ 0 $ / ---'-
Eliminar les etiquetes html
sed -I 's /†*.// g'-
Actualització eregdinscodi PHP vell per executardinsphp7 o posterior
sed 's / ereg ( ([^,] * ). ([^)] * ) ./ strpos ( 2, 1) / g'
Comprovarsi sedés anterior a una versió determinada
sed -I 'v 4.5'-

Exemple de versió sed ramificació a bash

A la part superior dels exemples, hi ha una línia per comprovar si sed és anterior a una versió determinada que podem utilitzar per implementar la versió de bifurcació en bash, que crec que és més fàcil que intentar implementar una funció per comparar els números de versió de la sortida de la versió sed . L’únic inconvenient és que si hi ha una versió anterior de sed que no admet l’ordre v, estem en problemes.

Ordres

test-sed-version-at-most() {
trobo -n | sed 'v$ {1}'-2> /dev/nul
}
versió de prova()
{
trobo -n 'Versió$ {1}. Bé. Fes-ho;
test-sed-version-at-most$ {1} && {
trobo -n 'vell';
cert
} || {
trobo -n 'nou'
};
trobo 'camí'.
}
principal()
{
localv;
pervdins 4.{4,5};
fer
versió de prova$ {v};
fet
}
principal

Sortida

Versió4.4. Bé. Feu-ho a l’antiga.
Versió4.5. Bé. Feu-ho de la nova manera.

Tingueu en compte que la versió de sed que s’executa a la meva màquina a l’hora d’escriure aquests caràcters és 4.4, cosa que explicaria la sortida anterior. A més, al mateix temps, la darrera versió de gnu sed era de 4,7, uns 3 anys més gran que la que tinc. El meu sed és vell! De fet, a sed 4.0.6, es va afegir un paràmetre a l'ordre version, de manera que aquesta estratègia funciona per a qualsevol dita v4.0.6, que és indulgent tenint en compte que la versió es va llançar a principis del 2003. Ets bo.

Vaig fer algunes excavacions addicionals, realment llegint NOTÍCIES del darrer codi font. La versió 4.6 té una nova característica, –debug que aboca l’script i anota les línies de sortida. Això us permetrà traduir scripts sed generats per funcions en bash a forma canònica. Guai! No oblideu que necessiteu una versió sed que es basi en bash. Aquí és on entra en joc aquest sedós exemple.

Exemple de funció bash amb sed per despullar etiquetes HTML

Als exemples anteriors hi ha una línia per eliminar etiquetes HTML. Posem això en una funció bash i l'utilitzem per eliminar totes les etiquetes HTML de l'últim article que vaig escriure.

Ordres

strip-tags()
{
sed -I 's /†*.// g'-
}
arrissar https://linuxhint.com/bash_cut_command/ --silenciat |strip-tags

No puc dir que sigui perfecte, però almenys es pot llegir al terminal.

Exemples de Sed amb fluxos de treball: Exemple de flux de treball: substituïu de manera segura tots mitjançant find, grep i sed

És segur dir que els canvis fets amb sed amb l’opció -i són irreversibles. És a dir, tret que estigueu completament segur del text que s'ha de substituir, és probable que acabeu amb un caràcter menys del previst. És per això que, en aquest exemple, utilitzarem sed en un flux de treball per substituir de manera segura el text de tots els fitxers que hàgiu seleccionat.

Flux de treball

  1. trobar
  2. adherència
  3. sed
trobar

Aquí seleccionareu els fitxers a substituir. Suggereixo utilitzar una ordre en aquestes línies:

trobar tipusf-nom | adherència -v-I| xargs-i ...

Per exemple, és possible que vulgueu limitar els fitxers per substituir els fitxers PHP, excloent els directoris del dipòsit git, de la manera següent.

trobar tipusf-nom*.php| adherència -v -I '.go' | xargs -i...

Llegiu més sobre l'ordre xargs a bash.

adherència

A continuació, intentarem fer coincidir some_pattern als fitxers seleccionats de la següent manera. Tingueu en compte que, com que estem fent servir l'opció -o per grep, la sortida només mostrarà la cadena coincident si n'hi ha.

trobar tipusf-nom*.php| adherència -v -I '.go' |
xargs -i adherència -Isome_pattern-o

L'ordre anterior hauria de retornar una llista de cadenes que coincideixin amb some_pattern.

sed

Finalment, volem substituir totes les cadenes que coincideixin amb some_pattern. Per fer-ho, hem de convertir grep en sed de la manera següent.

trobar tipusf-nom*.php| adherència -v -I '.go' |
xargs -i sed -i -Is/some_pattern/substitució/g

L’ordre grep es converteix en sed -i i s’elimina l’opció -o. I aquí ho teniu.

Ara podeu comprovar quines cadenes es substituiran prèviament en lloc de provar sort.

Notes finals sobre les opcions utilitzades en exemples

A continuació, es mostra una llista d’opcions que s’utilitzen en els exemples sed comentats breument.

Opció Descripció
-i Edita al lloc. Si l'entrada és un fitxer (no introduït), el resultat de les expressions sobreescriurà el contingut del fitxer.

Sed n'accepta un

per exemple, sed -n ...

-I -e significa expressió. El seu paràmetre és una expressió en el llenguatge sed.

Sed n'accepta molts

per exemple, sed -e'expr1 '-e'expr2'

-n Amaga la línia no afectada per l'expressió. És a dir, si l'expressió és una declaració d'impressió en l'idioma sed, les línies que no s'incloguin a la declaració d'impressió no s'inclouran a la sortida.

per exemple, sed -n ...

Per obtenir més informació sobre les opcions de sed disponibles, vegeu sed –help

Notes finals sobre ordres equivalents que s'utilitzen en exemples

Les següents utilitats de línia d’ordres s’inclouen als exemples sed amb ordres equivalents.

  • ordenar
  • cap
  • cua
  • adherència
  • gat
  • NS
  • tee

Nota final al final, per exemple ordres equivalents

En cas que us pregunteu què passa amb el personatge - de l'exemple, aquesta nota és la vostra. Vaig afegir un caràcter - després de la majoria d'ordres en els exemples per donar a entendre que esperem que l'entrada es rebi a través d'una canonada. Això és,

gatalgun fitxer| ordenar -R-| cap -1

Tanmateix, quan hi ha l'ordre a la part esquerra de la canonada, podem ometre la pista de la manera següent.

gatalgun fitxer| ordenar -R | cap -1

Això és el que passava amb el caràcter - després de les ordres dels exemples.

Notes finals sobre les funcions per configurar

En cas que ho busqueu, aquí teniu funcions per a la configuració dels exemples anteriors. La sortida obtinguda mitjançant declarar -f. Llegiu més sobre l'ordre declare a bash per obtenir més usos.

Ordres

paraules()
{
seq 100
}
barra()
{
trobo ---
}
vell-php()
{
trobo 'ereg ($ UA,' Bottybot ')'
}

Linia inferior

Em va agradar escriure exemples de Bash sed i fins i tot vaig agafar alguns trucs addicionals pel camí. Sed és una potent utilitat de línia de comandes i un llenguatge expressiu per manipular fitxers de text. Si us ha agradat aprendre sobre el sed, no us preocupeu, encara n’hi ha moltes més per tocar. Sed on.