logo

Ordre Sed a Linux/Unix amb exemples

L'ordre 'sed' de Linux significa editor de flux. S'utilitza per editar fluxos (fitxers) mitjançant expressions regulars. Però aquesta edició no és permanent. Només es mostra a la pantalla, però en realitat, el contingut del fitxer continua sent el mateix.

Principalment, s'utilitza per a la substitució de text; a més, es pot utilitzar per a altres operacions de manipulació de text com inserir, suprimir, cercar i molt més. L'ordre sed ens permet editar fitxers sense obrir-los. El suport d'expressió regular el converteix en una eina de manipulació de text més potent.

Visió general de l'ordre sed

És una utilitat Unix que transforma i analitza text amb un llenguatge de programació compacte i senzill. Va ser integrat des de 1973 fins a 1974 per Lee E. McMahon de Bell Labs i avui està present per a gairebé tots els sistemes operatius. L'ordre sed es basava en els aspectes de script de l'anterior qed (editor ràpid) i l'editor interactiu ed. Va ser l'eina més antiga per donar suport a expressions regulars i es manté activa per al processament de text, sobretot amb l'ordre de substitució. Les eines alternatives famoses inclouen Perl i AWK per 'edició del flux' i manipulació de cadenes de text pla.

Mode d'operació del comandament sed

L'ordre sed és una utilitat de processament de text orientada a línies: línia per línia llegeix el text d'un fitxer o flux d'entrada en un buffer intern conegut com a espai de patró. Totes les lectures de línia comencen un cicle. L'ordre sed utilitza una o diverses operacions que han estat descrites per un script sed a l'espai de patrons. Opera un llenguatge de programació amb unes 25 ordres que descriuen les operacions sobre el text.

Per a totes les línies d'entrada, l'ordre sed normalment dóna lloc a l'espai del patró i torna a iniciar el cicle amb la línia següent després d'executar l'script. Altres naturalesa de final de l'script estan disponibles a les ordres de l'script i les opcions de configuració, per exemple, N per incloure immediatament la línia següent a l'espai del patró, q per sortir, d per eliminar l'espai del patró, etc. Per tant, un script sed es relaciona amb un cos de bucle que itera des d'una línia de racionalització, en què la variable de bucle i el propi bucle es mantenen i implícites per sed.

  • Un script sed es pot descriure a la línia d'ordres o llegir-se a través d'un fitxer aïllat. A l'script sed, les ordres poden tenir una adreça addicional en el context d'expressions regulars o números de línia. L'adreça decideix quan s'executa l'ordre. Per exemple, 2d només executarà l'ordre d (o suprimir) a la segona línia d'entrada, mentre que /^ /d eliminarà totes les línies que comencen amb un espai.
  • L'espai de retenció, un buffer especial aïllat, pot ser utilitzat per algunes ordres sed per mantenir un text acumulat entre cicles. El llenguatge d'ordres de sed només té dues variables (espai de patró i espai de retenció) i una funcionalitat de ramificació semblant a GOTO. Tanmateix, l'idioma és Turing-complet. Els scripts sed esotèrics estan disponibles per a diversos jocs com el tetris, els escacs, l'arkanoid i el sokoban.
  • El bucle principal s'executa per a totes les línies del flux d'entrada, comprovant l'script sed a totes les línies de l'entrada. Les línies de l'script sed són totes un parell de patró-acció, que representen quin patró per a la concordança i quina acció implementar, que es pot copiar com a declaració condicional. Les accions per defecte (imprimir l'espai del patró, copiar la línia a l'espai del patró), els fluxos d'entrada i sortida i les variables de treball (espai de retenció i espai del patró) estan implícites; és possible especificar programes concisos d'una línia a causa del bucle principal.

Ús de l'ordre sed

    Comandament de substitució
    L'exemple següent representa l'ordre i l'ús més típic de l'ordre sed, és a dir, la substitució. L'ús va ser la motivació real de l'ordre sed:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameAltres ordres de sed
    També són possibles altres maneres de processar senzillament amb unes 25 ordres sed. Per exemple, a continuació s'utilitza l'opció d per filtrar línies que només inclouen espais i el final del caràcter de línia:
    sed '/^ *$/d' inputFileName
    L'exemple anterior utilitza alguns dels metacaràcters d'expressió regular següents:
    • El cursor (^) és el mateix que l'inici de la línia.
    • El símbol del dòlar ($) és el mateix que la finalització de la línia.
    • L'asterisc (*) és el mateix que l'aparició de caràcters anteriors més o zero.
    • El símbol més (+) és el mateix que l'ocurrència d'un o múltiples caràcters anteriors.
    • El signe d'interrogació (?) és el mateix que l'aparició de caràcters anteriors més o zero.
    • El símbol de punt (.) és exactament el mateix que un caràcter.
    sed com a filtre
    Sovint, l'ordre sed s'utilitza com a filtre dins d'una canalització sota Unix:
    $generateData | sed 's/x/y/g'
    El programa generateData genera dades i l'ordre sed fa un petit canvi substituint x en lloc de y.Scripts sed basats en fitxers
    Sovint, és útil posar moltes ordres sed, una única ordre per cada línia, dins d'un fitxer d'script i utilitzar el senyalador -f per executar les ordres del fitxer:
    sed -f subst.sed inputFileName > outputFileName

Sintaxi:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Opcions:

A continuació es mostren algunes opcions de línia d'ordres de l'ordre sed:

-n, --quiet, --silenció: Ens permet imprimir amb força l'espai del patró.

-e script, --expression=script: S'utilitza per afegir l'script a les ordres a executar.

canviar el nom d'una carpeta linux

-f fitxer-script, --file=fitxer-script: S'utilitza per afegir el contingut del fitxer script a les ordres a executar.

--follow-symlinks: s'utilitza per seguir els enllaços simbòlics quan es processa al seu lloc.

-i[SUFIX], --in-place[=SUFIX]: s'utilitza per editar fitxers al seu lloc (crea una còpia de seguretat si s'ofereix l'opció SUFFIX).

-l N, --longitud-línia=N: S'utilitza per especificar la longitud de línia desitjada per a l'ordre `l'.

--posix: s'utilitza per desactivar totes les extensions GNU.

-E, -r, --regexp-estès: Ens permet utilitzar les expressions regulars esteses a l'script (per a la portabilitat utilitzeu POSIX -E).

-s, --separat: s'utilitza per considerar els fitxers com a separats i no com a únics i continua el flux llarg.

--caixa de sorra: S'utilitza per funcionar en mode sandbox.

-u, --unbuffered: S'utilitza per carregar les quantitats mínimes de dades dels fitxers d'entrada i esborra els buffers de sortida amb més freqüència.

-z, --null-data: S'utilitza per separar línies amb caràcters NUL.

--ajuda: s'utilitza per mostrar el manual d'ajuda.

--versió: S'utilitza per mostrar la informació de la versió.

Exemples de l'ordre sed

Vegem els següents exemples:

Sol·licitud al directori STDIN

L'ordre sed no només es limita a manipular fitxers; també, podem aplicar-lo al directori STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Les ordres anteriors substituiran el primer text pel segon patró de text. Considereu la sortida següent:

Filtre Sed de Linux

A partir de la sortida anterior, primer, hem realitzat l'ordre 'sed' en una cadena 'class7' on 'class' es canvia a 'jtp' i 7 a 10. Després hem realitzat l'ordre 'sed' en un flux 'msg.txt ' on 'aprendre' es converteix en 'estudiar'.

Substitució global

A l'exemple anterior, totes les paraules 'aprendre' no s'han editat a 'estudiar'. Per editar cada paraula, hem d'utilitzar una 'g' de substitució global. Editarà totes les paraules especificades en un fitxer o cadena.

Sintaxi:

 command | sed 's///g' 

Considereu els exemples següents:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Les ordres anteriors substituiran tot el patró de text especificat. Considereu la sortida següent:

Filtre Sed de Linux

A partir de la sortida anterior, executant l'ordre 'echo class7 class9 | sed 's/class/jtp/g'' tota la 'classe' es converteix en 'jtp' i amb l'ordre 'cat msg.txt | sed 's/learn/study/g'' tot el 'learn' es va convertir en 'study'.

Eliminació d'una línia

L'opció 'd' ens permetrà eliminar una línia completa d'un fitxer. Només hem d'especificar una paraula d'aquesta línia amb l'opció 'd', i aquesta línia s'eliminarà. Però tingueu en compte que se suprimiran totes les línies que tinguin la mateixa paraula. S'executarà com:

 cat | sed '//d' 

Considereu l'ordre següent:

forma completa de i d e
 cat msg.txt | sed '/jtp/d' 

L'ordre anterior suprimirà les línies que tenen la paraula 'jtp'. Considereu la sortida següent:

Filtre Sed de Linux

A partir de la sortida anterior, executant l'ordre 'cat msg.txt | sed '/jtp/d'' s'eliminen totes les línies que contenen la paraula 'jtp'.

Utilitzant l'ordre sed múltiple

L'opció '-e' ens permet executar les múltiples ordres sed alhora. Podem realitzar més d'una operació sed executant l'ordre com:

 sed -e ' ; ' 

Considereu l'ordre següent:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

L'ordre anterior aplicarà totes les operacions especificades al fitxer 'exm.txt'. Considereu la sortida següent:

Filtre Sed de Linux

Com podem veure a la sortida anterior, totes les paraules 'vermelles' es substitueixen per 'blau' i totes les paraules 'grogues' es substitueixen per 'negre'. També podem separar ordres com aquesta:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

El resultat serà el mateix que l'ordre anterior.

Lectura d'ordres d'un fitxer

Podem desar les ordres sed en un fitxer i aplicar-les alhora a qualsevol fitxer. Es pot fer especificant l'opció '-f' de la següent manera:

combinar ordenar
 sed -f 

Des de l'ordre anterior, el '' és un fitxer que té una llista d'ordres sed. Considereu l'ordre següent:

 sed -f SedCommands exm.txt 

L'ordre anterior aplicarà totes les ordres especificades al fitxer 'SedCommand' a 'exm.txt'. Considereu la sortida següent:

Filtre Sed de Linux

A partir de la sortida anterior, hem utilitzat ordres aplicades a l'exemple anterior. Per tant, la sortida és la mateixa que l'exemple anterior.

Substitució de caràcters

Podem utilitzar el signe d'exclamació (!) com a delimitador de cadena. Per exemple, volem substituir l'intèrpret d'ordres bash i substituir-lo per l'intèrpret d'ordres csh a '/etc/passwd'. Per fer-ho, executeu l'ordre següent:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Podem aconseguir el mateix resultat executant l'ordre següent:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Limitant el sed

L'ús bàsic de l'ordre sed processa tot el fitxer. Però, podem limitar l'ordre sed i especificar qualsevol línia. Hi ha dues maneres de limitar l'ordre sed:

  • Un ventall de línies.
  • Un patró que coincideix amb una línia específica.

Podem proporcionar un número per especificar una línia de la següent manera:

 sed '3s/Red/Blue/' exm.txt 

L'ordre anterior aplicarà l'operació especificada a la tercera línia. Considereu la sortida següent:

Filtre Sed de Linux

A partir de la sortida anterior, només es modifica la línia tres.

També podem especificar un rang de línies. Per especificar un rang de línies, executeu l'ordre de la següent manera:

 sed '1,3s/Red/Blue/' exm.txt 

L'ordre anterior actualitzarà el text especificat a les línies 1 i 3. Considereu la sortida següent:

Filtre Sed de Linux

Inserir i afegir text

Els indicadors 'i' i 'a' s'utilitzen per inserir i afegir el text a un fitxer. La bandera 'i' afegirà el text abans de la cadena, i la bandera 'a' s'utilitza per afegir text després de la cadena. Considereu l'ordre següent:

 echo 'Another Demo' | sed 'iFirst Demo' 

L'ordre anterior inserirà el text abans del text 'Una altra demostració'. Considereu la sortida següent:

Filtre Sed de Linux

Per afegir text, executeu l'ordre de la següent manera:

 echo 'Another Demo' | sed 'aFirst Demo' 

L'ordre anterior afegirà el text. Considereu la sortida següent:

Filtre Sed de Linux

Modificació de línies

La bandera 'c' s'utilitza per modificar una línia específica. Per modificar una línia, executeu l'ordre de la següent manera:

 sed '3cThis is a modified line.' exm.txt 

L'ordre anterior actualitzarà la línia tres. Considereu la sortida següent:

què és un nom d'usuari
Filtre Sed de Linux

També podem utilitzar una expressió regular per actualitzar més d'una línia amb el mateix patró. Considereu l'ordre següent:

 sed '/Apple is /c Line updated.' exm.txt 

L'ordre anterior actualitzarà totes les línies que tinguin la cadena 'Apple is'. Considereu la sortida següent:

Filtre Sed de Linux

Transformació de Personatges

La bandera 'y' s'utilitza per transformar els caràcters. La transformació de caràcters no es pot limitar a esdeveniments concrets. Per transformar caràcters, executeu l'ordre de la següent manera:

 sed 'y/abc/def/' exm.txt 

L'ordre anterior transformarà els caràcters 'a', 'b', 'c' en 'd', 'e', 'f'. considereu la sortida següent:

Filtre Sed de Linux

Impressió dels números de línia

El signe '=' s'utilitza per imprimir el número de línia. Per imprimir el número de línia, executeu l'ordre de la següent manera:

 sed '=' exm.txt 

L'ordre anterior mostrarà el número de línia del contingut del fitxer. Considereu la sortida següent:

Filtre Sed de Linux

El signe igual amb l'opció '-n' especifica el número de línia que conté un script coincident. Considereu la sortida següent:

 sed -n '/mango/=' exm.txt 

L'ordre anterior mostrarà el número de línia que conté la paraula 'mango'. Considereu la sortida següent:

Filtre Sed de Linux

A la sortida anterior, podem veure que la línia número 2 té la paraula 'mango'.