Linux komanda “sed” apzīmē straumes redaktoru. To izmanto, lai rediģētu straumes (failus), izmantojot regulārās izteiksmes. Bet šī rediģēšana nav pastāvīga. Tas paliek tikai displejā, bet faktiski faila saturs paliek nemainīgs.
Galvenokārt to izmanto teksta aizstāšanai; turklāt to var izmantot citām teksta manipulācijas darbībām, piemēram, ievietošanai, dzēšanai, meklēšanai un citām darbībām. Komanda sed ļauj mums rediģēt failus, tos neatverot. Regulārās izteiksmes atbalsts padara to par jaudīgāku teksta manipulācijas rīku.
Pārskats par komandu sed
Tā ir Unix utilīta, kas pārveido un parsē tekstu ar kompaktu un vienkāršu programmēšanas valodu. To no 1973. līdz 1974. gadam integrēja Lī E. Makmahons no Bell Labs, un šodien tas ir pieejams gandrīz visās operētājsistēmās. Komanda sed balstījās uz iepriekšējā qed (ātrā redaktora) un ed interaktīvā redaktora skriptēšanas aspektiem. Tas bija agrākais rīks regulāro izteiksmju atbalstam, un tas joprojām ir aktīvs teksta apstrādei, vissvarīgāk ar aizstāšanas komandu. Slaveni alternatīvie rīki ietver Perl un AWK for 'straumes rediģēšana' un vienkārša teksta virkņu manipulācijas.
uzlabota cilpai java
sed komandas darbības režīms
Komanda sed ir uz rindiņu orientēta teksta apstrādes utilīta: tā rindiņu pa rindiņai nolasa tekstu no faila vai ievades straumes iekšējā buferī, kas pazīstams kā šablona telpa. Visas rindas nolasīšanas sāk ciklu. Komandā sed tiek izmantota viena vai vairākas darbības, kuras ir aprakstītas ar sed skriptu modeļa telpā. Tas darbojas ar programmēšanas valodu, izmantojot aptuveni 25 komandas, kas apraksta darbības ar tekstu.
Visām ievades rindām komanda sed parasti rada šablona telpu un pēc skripta izpildes atkal sāk ciklu ar nākamo rindiņu. Citas skripta beigu īpašības ir pieejamas no skripta komandām un iestatīšanas opcijām, piemēram, N, lai uzreiz iekļautu nākamo rindiņu raksta telpā, q, lai izietu, d, lai noņemtu raksta atstarpi, un tā tālāk. Tādējādi sed skripts attiecas uz cilpas pamattekstu, kas atkārtojas no pilnveidošanas līnijas, kurā sed uztur un netieši nodrošina cilpas mainīgo un pašu cilpu.
- Sed skriptu var aprakstīt komandrindā vai lasīt, izmantojot izolētu failu. Sed skriptā komandām var būt nepieciešama papildu adrese regulāro izteiksmju vai rindu numuru kontekstā. Adrese nosaka, kad komanda tiek izpildīta. Piemēram, 2d izpildīs komandu d (vai dzēst) tikai 2. ievades rindā, savukārt /^ /d noņems katru rindiņu, kas sākas ar atstarpi.
- Aizturēšanas vietu, izolētu īpašu buferi, var izmantot dažas sed komandas, lai starp cikliem saglabātu akumulējošu tekstu. sed komandu valodai ir tikai divi mainīgie (raksta telpa un turēšanas atstarpe) un GOTO līdzīga sazarošanas funkcionalitāte. Tomēr valoda ir Tjūringa pilnīga. Ezotēriskie sed skripti ir pieejami vairākām spēlēm, piemēram, tetris, šahs, arkanoid un sokoban.
- Galvenā cilpa darbojas visās ievades straumes rindās, pārbaudot sed skriptu visās ievades rindās. Visas sed skripta rindas ir parauga-darbības pāris, kas norāda, kāds modelis ir jāsaskaņo un kura darbība jāievieš, ko var kopēt kā nosacījumu. Noklusētās darbības (drukāšanas parauga telpa, līnijas kopēšana raksta telpā), ievades un izvades straumes un darba mainīgie (turēšanas atstarpe un raksta telpa) ir netiešas; galvenās cilpas dēļ ir iespējams norādīt īsas vienrindas programmas.
Komandas sed izmantošana
- Burtzīme (^) ir tāda pati kā rindas sākums.
- Dolāra simbols ($) ir tāds pats kā rindas pabeigšana.
- Zvaigznīte (*) ir tāda pati kā vairāk vai nulle iepriekšēja rakstzīme.
- Plus simbols (+) ir tāds pats kā viena vai vairākas iepriekšējās rakstzīmes.
- Jautājuma zīme (?) ir tāda pati kā vairāk vai nulle iepriekšējā rakstzīme.
- Punkta simbols (.) ir tieši tāds pats kā viena rakstzīme.
Tālāk sniegtajā piemērā ir parādīta visizplatītākā sed komandas komanda un tipiskākā lietošana, t.i., aizstāšana. Izmantošana bija faktiskā sed komandas motivācija:
sed 's/regexp/replacement/g' inputFileName > outputFileName
Vienkāršai apstrādei ar dažām 25 sed komandām ir iespējami arī citi veidi. Piemēram, tālāk tiek izmantota opcija d, lai filtrētu rindas, kurās ir tikai atstarpes un rindiņas rakstzīmju beigas:
sed '/^ *$/d' inputFileName
Iepriekš minētajā piemērā ir izmantotas dažas no tālāk norādītajām regulārās izteiksmes metarakstzīmēm:
Bieži vien komanda sed tiek izmantota kā filtrs konveijerā saskaņā ar Unix:
$generateData | sed 's/x/y/g'
GeneData programma ģenerē datus, un komanda sed veic nelielas izmaiņas, aizstājot y vietā x.
Bieži vien ir lietderīgi skripta failā ievietot daudzas sed komandas, vienu komandu katrā rindā, un izmantot karodziņu -f, lai izpildītu komandas no faila:
sed -f subst.sed inputFileName > outputFileName
Sintakse:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
Iespējas:
Tālāk ir norādītas dažas komandas sed komandrindas opcijas:
-n, --kluss, --kluss: Tas spēcīgi ļauj mums izdrukāt raksta telpu.
-e skripts, --expression=script: To izmanto, lai skriptu pievienotu izpildāmajām komandām.
-f skripta fails, --file=skripta fails: To izmanto, lai skripta faila saturu pievienotu izpildāmajām komandām.
--seko-simsaitēm: to izmanto, lai sekotu simbolu saitēm, apstrādājot vietā.
-i[SUFFIX], --vietā[=SUFFIX]: to izmanto, lai rediģētu failus vietā (izveido dublējumu, ja tiek nodrošināta opcija SUFFIX).
-l N, -- līnijas garums = N: To izmanto, lai norādītu vēlamo rindas aplaušanas garumu komandai 'l'.
--posix: to izmanto, lai atspējotu visus GNU paplašinājumus.
-E, -r, --regexp-extended: Tas ļauj skriptā izmantot paplašinātās regulārās izteiksmes (pārnesamībai izmantojiet POSIX -E).
-s, --atsevišķi: to izmanto, lai uzskatītu failus par atsevišķiem, nevis kā vienu, un turpina garo straumi.
--smilšu kaste: To izmanto, lai darbotos smilškastes režīmā.
-u, -- unbuffered: To izmanto minimāla datu apjoma ielādei no ievades failiem un biežāk izskalo izvades buferus.
-z, --null-data: To izmanto, lai atdalītu rindas ar NUL rakstzīmēm.
--palīdzība: to izmanto, lai parādītu palīdzības rokasgrāmatu.
-- versija: To izmanto, lai parādītu informāciju par versiju.
sed komandas piemēri
Apskatīsim šādus piemērus:
virkņu masīva izveide Java
- Pieteikšanās STDIN direktorijā
- Globālā aizstāšana
- Līnijas noņemšana
- Izmantojot komandu Multiple sed
- Komandu lasīšana no faila
- Rakstzīmju aizstāšana
- Ierobežojot sed
- Teksta ievietošana un pievienošana
- Līniju modificēšana
- Rakstzīmju transformācija
- Rindu numuru drukāšana
Pieteikšanās STDIN direktorijā
Komanda sed neaprobežojas tikai ar failu manipulācijām; arī mēs varam to lietot STDIN direktorijā.
echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/'
Iepriekš minētās komandas aizstās pirmo tekstu ar otro teksta modeli. Apsveriet tālāk norādīto izvadi:
No iepriekš minētās izvades, pirmkārt, mēs esam izpildījuši komandu 'sed' virknei 'class7', kur 'class' tiek mainīts uz 'jtp' un 7 uz 10. Pēc tam mēs esam izpildījuši komandu 'sed' straumē 'msg.txt'. “, kur “mācīties” tiek pārveidots par “mācīties”.
Globālā aizstāšana
Iepriekšējā piemērā visi vārdi “mācīties” netika rediģēti kā “mācīties”. Lai rediģētu katru vārdu, mums ir jāizmanto globāls aizstājējs 'g'. Tas rediģēs visus norādītos vārdus failā vai virknē.
Sintakse:
command | sed 's///g'
Apsveriet tālāk sniegtos piemērus:
echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g'
Iepriekš minētās komandas aizstās visu norādīto teksta modeli. Apsveriet tālāk norādīto izvadi:
No iepriekš minētās izvades, izpildot komandu 'echo class7 class9 | sed 's/class/jtp/g'' visa 'klase' tiek pārveidota par 'jtp' un ar komandu 'cat msg.txt | sed 's/learn/study/g'' viss 'mācīties' tika pārveidots par 'study'.
Līnijas noņemšana
Opcija 'd' ļaus mums noņemt visu rindiņu no faila. Mums tikai jānorāda vārds no šīs rindas ar opciju “d”, un šī rinda tiks dzēsta. Taču ņemiet vērā, ka visas rindas ar vienu un to pašu vārdu tiks dzēstas. Tas tiks izpildīts šādi:
cat | sed '//d'
Apsveriet tālāk norādīto komandu:
cat msg.txt | sed '/jtp/d'
Iepriekš minētā komanda izdzēsīs rindas, kurās ir vārds “jtp”. Apsveriet tālāk norādīto izvadi:
No iepriekš minētās izvades, izpildot komandu 'cat msg.txt | sed '/jtp/d' tiek dzēstas visas rindas, kurās ir vārds 'jtp'.
Izmantojot komandu Multiple sed
Opcija “-e” ļauj izpildīt vairākas sed komandas vienlaikus. Mēs varam veikt vairāk nekā vienu sed darbību, izpildot komandu kā:
kat timpf tīrā vērtība
sed -e ' ; '
Apsveriet tālāk norādīto komandu:
sed -e 's/red/blue/; s/yellow/black/' exm.txt
Iepriekš minētā komanda lietos visas failā 'exm.txt' norādītās darbības. Apsveriet tālāk norādīto izvadi:
Kā redzams no iepriekš minētā, visi “sarkanie” vārdi tiek aizstāti ar “zili” un visi “dzelteni” vārdi tiek aizstāti ar “melni”. Mēs varam arī atdalīt šādas komandas:
sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt
Rezultāts būs tāds pats kā iepriekšminētajai komandai.
Komandu lasīšana no faila
Mēs varam saglabāt sed komandas failā un lietot tās uzreiz jebkurā failā. To var izdarīt, norādot opciju “-f” šādi:
sed -f
No iepriekš minētās komandas '' ir fails, kuram ir sed komandu saraksts. Apsveriet tālāk norādīto komandu:
sed -f SedCommands exm.txt
Iepriekš minētā komanda lietos visas norādītās komandas failā 'SedCommand' failā 'exm.txt'. Apsveriet tālāk norādīto izvadi:
No iepriekš minētās izvades mēs esam izmantojuši komandas, kas lietotas iepriekšējā piemērā. Tātad izvade ir tāda pati kā iepriekšējā piemērā.
Rakstzīmju aizstāšana
Izsaukuma zīmi (!) varam izmantot kā virknes norobežotāju. Piemēram, mēs vēlamies aizstāt bash čaulu un aizstāt to ar csh apvalku mapē '/etc/passwd'. Lai to izdarītu, izpildiet tālāk norādīto komandu:
sed 's//bin/bash//bin/csh/' /etc/passwd
To pašu rezultātu varam sasniegt, izpildot tālāk norādīto komandu:
sed 's!/bin/bash!/bin/csh!' /etc/passwd
Ierobežojot sed
Komandas sed pamata izmantošana apstrādā visu failu. Bet mēs varam ierobežot sed komandu un norādīt jebkuru rindiņu. Ir divi veidi, kā ierobežot sed komandu:
- Līniju klāsts.
- Raksts, kas atbilst noteiktai līnijai.
Mēs varam norādīt numuru, lai norādītu rindu šādi:
sed '3s/Red/Blue/' exm.txt
Iepriekš minētā komanda piemēros norādīto darbību trešajā rindā. Apsveriet tālāk norādīto izvadi:
No iepriekš minētās izvades tiek mainīta tikai trešā rinda.
Mēs varam arī norādīt līniju diapazonu. Lai norādītu rindu diapazonu, izpildiet komandu šādi:
sed '1,3s/Red/Blue/' exm.txt
Iepriekš minētā komanda atjauninās norādīto tekstu 1. un 3. rindā. Apsveriet tālāk norādīto izvadi:
Teksta ievietošana un pievienošana
Karodziņus “i” un “a” izmanto, lai failā ievietotu un pievienotu tekstu. Karogs “i” pievienos tekstu pirms virknes, un karodziņš “a” tiek izmantots, lai pievienotu tekstu aiz virknes. Apsveriet tālāk norādīto komandu:
echo 'Another Demo' | sed 'iFirst Demo'
Iepriekš minētā komanda ievietos tekstu pirms teksta “Cita demonstrācija”. Apsveriet tālāk norādīto izvadi:
Lai pievienotu tekstu, izpildiet komandu šādi:
echo 'Another Demo' | sed 'aFirst Demo'
Iepriekš minētā komanda pievienos tekstu. Apsveriet tālāk norādīto izvadi:
Līniju modificēšana
Karodziņu “c” izmanto, lai modificētu noteiktu rindu. Lai mainītu rindu, izpildiet komandu šādi:
sed '3cThis is a modified line.' exm.txt
Iepriekš minētā komanda atjauninās trešo rindu. Apsveriet tālāk norādīto izvadi:
kas ir lietotājvārds
Mēs varam arī izmantot regulāro izteiksmi, lai atjauninātu vairākas rindas ar vienādu modeli. Apsveriet tālāk norādīto komandu:
sed '/Apple is /c Line updated.' exm.txt
Iepriekš minētā komanda atjauninās visas rindas ar virkni 'Apple ir'. Apsveriet tālāk norādīto izvadi:
Rakstzīmju transformācija
'Y' karodziņš tiek izmantots, lai pārveidotu rakstzīmes. Rakstzīmju pārveidošanu nevar ierobežot ar konkrētiem gadījumiem. Lai pārveidotu rakstzīmes, izpildiet komandu šādi:
sed 'y/abc/def/' exm.txt
Iepriekš minētā komanda pārveidos rakstzīmes 'a', 'b', 'c' par 'd', 'e', 'f'. apsveriet tālāk norādīto izvadi:
Rindu numuru drukāšana
Zīme “=” tiek izmantota, lai drukātu rindas numuru. Lai izdrukātu rindas numuru, izpildiet komandu šādi:
sed '=' exm.txt
Iepriekš minētā komanda parādīs faila satura rindas numuru. Apsveriet tālāk norādīto izvadi:
Vienādības zīme ar opciju “-n” norāda rindas numuru, kurā ir atbilstošs skripts. Apsveriet tālāk norādīto izvadi:
sed -n '/mango/=' exm.txt
Iepriekš minētā komanda parādīs rindas numuru, kurā ir vārds 'mango'. Apsveriet tālāk norādīto izvadi:
No iepriekš minētās izvades mēs varam redzēt, ka rindas numurs 2 satur vārdu 'mango'.