Inställning för sed-exempel
Här är en snabbguide för att komma igång för exemplet, som jag kommer att försöka att inte göra för mycket.
”Ord” är en textfil som innehåller siffrorna 1 till 100. Om du är osäker på kommandot för att skapa det, se Exportfunktion för xargs i Bash Export Command. Du vet aldrig att det kan vara i din nästa shell-skriptintervju.
”Bar” är en textfil som innehåller en enda rad -.
“Old-php” är en textfil som innehåller rader med gammal PHP som kommer att brytas i php7 eller senare. (Tips: ereg)
Observera att alla funktioner som beskrivs ovan finns i Endnote om funktioner för installation.
Sed-exempel med motsvarande kommandon
I en kommandoradsmiljö hittar du att det finns mer än en lösning på en viss uppgift. Men för det mesta vill du gå med den väg som ger minst motstånd. Här är en lista med exempel på sed-kommandon med motsvarande motsvarande kommandon, där några kommer att behandlas i detalj nedan.
1. Skriv ut en slumpmässig rad (motsvarar sortering -R - | huvud -1)
sed -n "$ ((RANDOM% 100)) p" -2.Skriv ut den sista raden i filen (motsvarar huvud -1 -)
sed -n '$ p' -3. Skriv ut de första 10 raderna i en fil (motsvarar head -n 10 -)
sed '10q' -4. Skriv ut den första raden i en fil (motsvarar svans -1 -)
sed -n '1p' -5. Ta bort alla förekomster av ett tecken (motsvarar tr -delete '0' -, där 0 är det tecken vi vill ta bort)
sed -e 's / 0 // g' -6. Konvertera csv-fil till tsv (motsvarar tr ', "\ t' -)
sed -e's /, / \ t / g ' -7.Lägg till rad till fil (motsvarar kattfält -)
sed '$ a ---' -8. Förbered raden till filen (motsvarar cat-bar)
sed '1i ---' -9. Skriv ut alla rader i filen (motsvarar katt -)
sed -n -e 'p' -10. Skriv ut rader som matchar ett mönster (motsvarar grep -e '^ 1' -)
sed -n -e '/ ^ 1 / p' -11. Radera rader som matchar ett mönster (motsvarar grep -v -e '^ 1' -)
sed -e '/ ^ 1 / d' -12. Få antalet rader i en fil (motsvarar wc -l -)
sed -n -e '$ =' -13. Skriv till en fil i bakgrunden (motsvarande kommandot)
sed "w $ 1" -Exempel på att använda sed för att implementera tee-kommandot
Rätt ovan finns ett exempel märkt Skriv till en fil i bakgrunden. Typ av ljud som tee-kommandot. Det är det. Här kommer vi att utöka hur man implementerar en funktion för att ersätta tee in bash med sed.
Kommandon
tee ()testa $ # -ekv 1 || lämna tillbaka;
sed "w $ 1" -
huvud ()
seq 10 | tee tio;
katt tio
huvud
Produktion
12
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
Här ser du två listor över heltal från 1 till 10. Den första är från seq-kommandot. Den andra får vi från katten i filen skriven i tee. Jag vet att det är löjligt men det fungerar!
Exempel på att använda sed för att skriva ut en slumpmässig rad i en fil
Antag att vi vill skriva ut en slumpmässig rad i en fil med bash och lite sed. Kan vi göra det? Ja det kan vi! Här är hur.
Implementera en funktion som
- Hämtar antalet rader i en fil, L
- Skapar ett slumpmässigt tal mellan 1 och L, R
- Skriver ut R
Funktionen förväntar sig att ingången ska ledas från utsidan.
Kommandon
en rad ()funktion lc ()
sed -n -e '$ =' -
;
funktion utskriftslinje ()
sed -n -e "$ 1 p" -
;
temp = $ (mktemp);
katt -> $ temp;
katt $ temp | utskrift $ ((RANDOM% $ (cat $ temp | lc) + 1));
rm $ temp
Exempel på användning (1)
sek 100 | _Utgång (1)
35Exempel på användning (2)
curl https: // linuxhint.com / bash_cut_command / --silent | strip-tags | en radSe exemplet nedan med sed för att ta bort HTML-taggar. Observera att överexemplet ibland returnerar tomt för tomma rader. Som en övning kan den förbättras.
Använd sed för att skriva ut rader i en fil
Antag att du vill implementera en funktion i bash för att skriva ut en viss rad i en fil. Att försöka skriva ut en rad i en fil med en slinga i bash, head, tail eller awk är för mycket arbete för att skriva ut rader i en fil. Bra att vi har sed. Den resulterande funktionen med användning av sed skulle vara som följer.
Kommandon
trycklinje ()sed -n "$ 1 p" -
Låt oss nu se vad som händer när vi använder utskriftslinje på ord.
Kommandon
ord | trycklinje 50Produktion
50Okej. Ser bra ut men låt oss prova något som ser lite mindre trivialt ut.
Kommandon
förklara -xf orddeklarera -xf utskriftslinje
seq 1 10 $ (ord | wc -l) | xargs -i bash -c "ord | utskriftsrad "
Produktion
111
21
31
41
51
61
71
81
91
Okej. Nu är det mer som det! Du ser hur sed kan användas i ett bash-skript för att skriva ut vilken rad som helst i en fil.
Sed-exempel utan motsvarande kommandon
I en kommandoradsmiljö är ibland vägen till en lösning som ger minst motstånd den sedda vägen; annars slutar du göra mer arbete än vad som krävs i första hand. Vissa kommandon kan visas nedan.
Kommandera alla rader i ett skalskript
sed -e's / ^ / # / ' -Radera första raden
sed -e '1d' -
Radera sista raden
sed -e '$ d' -
Infoga en linje före linjer som matchar ett mönster
sed '/ 0 $ / i ---' -
Infoga en rad efter rader som matchar ett mönster
sed '/ 0 $ / ---' -
Ta bort html-taggar
sed -e's /<[^>] *.// g ' -
Uppgradera ereg i gammal php-kod för att köras i php7 eller senare
sed's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Kontrollera om sed är tidigare än en viss version
sed -e 'v 4.5 ' -
Exempel på sed-version grenad i bash
Ovan i exemplen finns det en rad för att kontrollera om sed är tidigare än en viss version som vi kan använda för att implementera versiongrenning i bash, vilket jag tror är lättare än att försöka implementera en funktion för att jämföra versionsnummer från sed -version output. Den enda fallgropen är att om det finns en tidigare version av sed som inte stöder kommandot v, så är vi i trubbel.
Kommandon
test-sed-version-at-most ()eko -n | sed "v $ 1" - 2> / dev / null
provversion ()
echo -n "Version $ 1. Okej. Gör det ";
test-sed-version-at-most $ 1 &&
eko -n "gammal";
Sann
||
eko -n "ny"
;
eko "sätt."
huvud ()
lokal v;
för v i 4.4,5;
do
provversion $ v;
Gjort
huvud
Produktion
Version 4.4. Okej. Gör det på det gamla sättet.Version 4.5. Okej. Gör det på det nya sättet.
Observera att versionen av sed som körs på min maskin när du skriver dessa tecken är 4.4, vilket skulle förklara resultatet ovan. Samtidigt var den senaste versionen av GNU Sed 4.7, ungefär 3 år äldre än den jag har. Min sed är gammal! I själva verket i sed 4.0.6, en parameter lades till versionskommandot så den här strategin fungerar för alla nämnda åtminstone v4.0.6, vilket är skonsamt med tanke på att den versionen släpptes i början av 2003. Du är bra.
Jag grävde extra, faktiskt NYHETER som läste ut den senaste källkoden. Version 4.6 har en ny funktion, -debug som dumpar skriptet och kommenterar utgångslinjer. Detta gör att du kan översätta sed-skript som genereras av funktioner i bash till kanonisk form. Häftigt! Glöm inte att du behöver förgrena sig i sed version i bash. Det är där detta sedda exempel kommer till spel.
Exempel på bash-funktion med sed för att ta bort HTML-taggar
I exemplen ovan finns en rad för att ta bort HTML-taggar. Låt oss kasta det i en bash-funktion och använda den för att ta bort alla HTML-taggar från den senaste artikeln jag skrev.
Kommandon
strip-tags ()sed -e's /<[^>] *.// g ' -
curl https: // linuxhint.com / bash_cut_command / --silent | strip-tags
Jag kan inte säga att den är perfekt men åtminstone är den läsbar i terminalen.
Sed-exempel med arbetsflöden: Exempel på arbetsflöde: ersätt säkert alla med hjälp av find, grep och sed
Det är säkert att säga att ändringar som gjorts med sed med alternativet -i är irreversibla. Det är såvida du inte är helt säker på vilken text som ska ersättas, du kommer sannolikt att få ett tecken mindre än tänkt. Det är därför i det här exemplet använder vi sed i ett arbetsflöde för att säkert ersätta text i alla filer du har valt.
Arbetsflöde
- hitta
- grep
- sed
hitta
Här väljer du de filer som ska ersättas. Jag föreslår att du använder ett kommando på följande sätt:
hitta -typ f -namn | grep -v -e | xargs -i ..Du kanske till exempel vill begränsa filerna för att ersätta PHP-filer exklusive git-arkivkataloger enligt följande.
hitta -typ f -namn \ *.php | grep -v -e '.git '| xargs -i ..Läs mer om xargs-kommandot i bash.
grep
Därefter ska vi försöka matcha some_pattern i de valda filerna enligt följande. Observera att eftersom vi använder alternativet -o för grep, kommer utdata endast att visa matchad sträng om någon.
hitta -typ f -namn \ *.php | grep -v -e '.git '|xargs -i grep -e some_pattern -o
Kommandot ovan ska returnera en lista med strängar som matchar some_pattern.
sed
Slutligen vill vi ersätta alla strängar som matchar some_pattern. För att göra det måste vi konvertera grep till sed enligt följande.
hitta -typ f -namn \ *.php | grep -v -e '.git '|xargs -i sed -i -e s / some_pattern / ersättning / g
Grep-kommandot blir sed -i och alternativet -o tas bort. Och där har du det.
Nu kan du kontrollera vilka strängar som ska bytas ut i sed på förhand istället för att testa din lycka.
Slutnoter om alternativ som används i exempel
Här är en lista över alternativ som används i de sed-exempel som diskuteras kort.
Alternativ | Beskrivning |
-i | Redigera på plats. Om ingången är en fil (inte piped in) kommer resultatet av uttryck att skriva över innehållet i filen. Sed accepterar en t.ex.) sed -n .. |
-e | -e står för uttryck. Dess parameter är ett uttryck på sed-språket. Sed accepterar många t.ex.) sed -e 'expr1' -e 'expr2' ..
|
-n | Döljer linje som inte påverkas av uttrycket. Det vill säga om uttrycket är ett utskriftsuttalande i sed-språket, så ingår inte rader som inte ingår i utskriftsutdraget i utdata. t.ex.) sed -n ..
|
Mer information om tillgängliga alternativ finns i sed -help
Slutanteckningar om motsvarande kommandon används i exempel
Följande kommandoradsverktyg ingår i sed-exemplen med motsvarande kommandon.
- sortera
- huvud
- svans
- grep
- katt
- Tr
- tee
Slutanmärkning om efterföljande - i exempel motsvarande kommandon
Om du undrar vad som händer på - karaktären i exemplet, är denna anteckning för dig. Jag lade till ett tecken efter de flesta kommandon i exemplen för att leda till att vi förväntar oss att ingången tas emot genom ett rör. Det är,
cat some-file | sortera -R - | huvud -1Men när kommandot till vänster röret är närvarande kan vi utelämna tipsen enligt följande.
cat some-file | sortera -R | huvud -1Det var vad som pågick med kommandona - karaktär efter i exemplen.
Slutanmärkningar om funktioner för installation
Om du letar efter finns här funktioner för installationen för ovanstående exempel. Utgången erhållen med deklarera -f. Läs mer om deklarera kommandot i bash för fler användningsområden.
Kommandon
ord ()seq 100
bar ()
eko ---
old-php ()
echo 'ereg ($ UA, "Bottybot")'
Slutsats
Jag tyckte om att skriva Bash sed-exempel och plockade till och med upp några extra knep på vägen. Sed är ett kraftfullt kommandoradsverktyg och uttrycksfullt språk för att manipulera textfiler. Om du gillade att lära dig mer om sed, var inte orolig, det finns fortfarande mycket mer att röra vid. Satt på.