sed

Exempel på Bash Sed

Exempel på Bash Sed
Bash låter dig utföra mönsterbyte med variabel expansion som ($ var / mönster / ersättning). Och så, gör sed så här (sed -e / mönster / ersättning / '). Det finns dock mer att sed än att ersätta mönster i textfiler.  Här kommer vi att återupptäcka sed, med exempel, med motsvarande kommandon och arbetsflöden för att underlätta dagliga uppgifter.

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

1
2
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

  1. Hämtar antalet rader i en fil, L
  2. Skapar ett slumpmässigt tal mellan 1 och L, R
  3. 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)

35

Exempel på användning (2)

curl https: // linuxhint.com / bash_cut_command / --silent | strip-tags | en rad

Se 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 50

Produktion

50

Okej. Ser bra ut men låt oss prova något som ser lite mindre trivialt ut.

Kommandon

förklara -xf ord
deklarera -xf utskriftslinje
seq 1 10 $ (ord | wc -l) | xargs -i bash -c "ord | utskriftsrad "

Produktion

1
11
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

  1. hitta
  2. grep
  3. 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.

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 -1

Men 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 -1

Det 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å.

Battle for Wesnoth Tutorial
Slaget om Wesnoth är ett av de mest populära open source-strategispel som du kan spela just nu. Det här spelet har inte bara utvecklats under mycket l...
0 A.D. Handledning
Av de många strategispelen där ute, 0 A.D. lyckas framstå som en omfattande titel och ett mycket djupt, taktiskt spel trots att det är öppen källkod. ...
Unity3D självstudie
Introduktion till Unity 3D Unity 3D är en kraftfull spelutvecklingsmotor. Det är tvärplattform som gör att du kan skapa spel för mobil, webb, skrivbor...