Bash Sed Exempel

Bash Sed Examples



Bash låter dig utföra mönsterbyte med variabel expansion som ($ {var/pattern/replacement}). Och så, gör sed så här (sed -e ‘s/mönster/ersättning/’). Det finns dock mer att göra ä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.

Setup för sed exempel

Här är en snabbguide för att ställa in för exemplet, som jag kommer att försöka att inte göra för överkill.







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 på din nästa shell -skriptintervju.



barär en textfil som innehåller en enda rad -.



gammal-phpär en textfil som innehåller rader med gammal PHP som bryts i php7 eller senare. (Tips: ereg)





Observera att alla funktioner som beskrivs ovan finns nedan 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 given 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 sed -kommandon med motsvarande motsvarande kommandon, där några kommer att täckas i detalj nedan.



1. Skriv ut en slumpmässig rad (motsvarande sortering -R -| huvud -1)

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

2. Skriv ut den sista raden i filen (motsvarar head -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. Radera alla förekomster av ett tecken (motsvarande tr –delete ‘0’ -, där 0 är det tecken vi vill radera)

sed -Och 's / 0 // g'-

6. Konvertera csv -fil till tsv (motsvarar tr ‘,’ ‘ t’ -)

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

7. Lägg till rad i fil (motsvarar cat bar -)

sed '$ a ---'-

8. Förbered raden till filen (motsvarar cat -bar)

sed '1i ---'-

9. Skriv ut alla rader i filen (motsvarar cat -)

sed -n -Och 'p'-

10. Skriv ut en rad som matchar ett mönster (motsvarar grep -e ‘^1’ -)

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

11. Radera rader som matchar ett mönster (motsvarar grep -v -e ‘^1’ -)

sed -Och '/^1/ d'-

12. Få antalet rader i en fil (motsvarande wc -l -)

sed -n -Och '$ ='-

13. Skriv till en fil i bakgrunden (motsvarande kommandotee)

sed 'i$ {1}'-

Exempel med sed för att implementera tee -kommandot

Precis ovan finns ett exempel med namnet Skriv till en fil i bakgrunden. Låter lite som tee -kommandot. Det är det. Här kommer vi att expandera om hur man implementerar en funktion för att ersätta tee i bash med sed.

Kommandon

tee ()
{
testa $ {#} -ekv 1 || lämna tillbaka;
sed 'i$ {1}'-
}
huvud()
teedetta;
kattdetta

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 kommandot seq. Den andra får vi från katten i filen skriven i tee. Jag vet att det är löjligt men det fungerar!

Exempel med 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. Genererar ett slumpmässigt tal mellan 1 och L, R
  3. Utskrifter R

Funktionen förväntar sig att ingången kommer att ledas utifrån.

Kommandon

någon rad()
{
fungeralc()
{
sed -n -Och '$ ='-
};
fungeraprint-line()
{
sed -n -Och '$ {1}p '-
};
temp= $( mktemp );
katt-> $ {temp};
katt $ {temp} |print-line $((SLUMPMÄSSIG%$( katt $ {temp} |lc)+1 ));
rm $ {temp}
}

Exempel på användning (1)

seq 100 |_

Utgång (1)

35

Exempel på användning (2)

curl https://linuxhint.com/bash_cut_command/ --tyst |strip-taggar|någon rad

Se exemplet nedan med sed för att ta bort HTML -taggar. Observera att exemplet över 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 enda rad i en fil med en loop i bash, huvud, svans 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 sed skulle vara följande.

Kommandon

print-line()
{
sed -n '$ {1}p '-
}

Låt oss nu se vad som händer när vi använder utskriftsrad på ord.

Kommandon

ord|print-linefemtio

Produktion

femtio

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

Kommandon

deklarera -xford
deklarera -xfprint-line
seq 1 10$(ord| toalett -de ) | xargs-ivåldsamt slag -c 'ord | print-line {} '

Produktion

1
elva
tjugoett
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 vägen till en lösning som ger minst motstånd ibland det lugna sättet. annars gör du mer arbete än vad som krävs i första hand. Vissa kommandon kan visas nedan.

Kommando alla rader i ett skalskript

sed -Och s/^/#/'-
Radera första raden
sed -Och '1d'-
Raderasistalinje
sed -Och '$ d'-
Infoga en rad före rader 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 -Och 's /†*.// g'-
Uppgradera eregigammal php -kod att köraiphp7 eller senare
sed 's/ereg ( ([^,]*). ([^)]*) ./ strpos ( 2, 1)/g'
Kontrolleraom sedär tidigare än en viss version
sed -Och 'v 4.5'-

Exempel sed version förgrening i bash

Ovan i exemplen finns det en rad till Kontrollera om sed är tidigare än en viss version som vi kan använda för att implementera version branching 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 –versionsutgång . Den enda fallgropen är att om det finns en tidigare version av sed som inte stöder kommandot v, har vi problem.

Kommandon

test-sed-version-at-most() {
kastade ut -n | sed 'v$ {1}'-2> /dev/null
}
try-version()
{
kastade ut -n 'Version$ {1}. Okej. Gör det ';
test-sed-version-at-most$ {1} && {
kastade ut -n 'gammal';
Sann
} || {
kastade ut -n 'ny'
};
kastade ut 'sätt.'
}
huvud()
{
lokalv;
förvi 4.{4,5};
do
try-version$ {v};
Gjort
}
huvud

Produktion

Version4.4. Okej. Gör det på det gamla sättet.
Version4.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 utmatningen ovan. Samtidigt var den senaste versionen av gnu sed samtidigt 4,7, ungefär 3 år äldre än den jag har. Min sed är gammal! Faktum är att i sed 4.0.6 lades en parameter till versionskommandot så att denna strategi fungerar för alla nämnda åtminstone v4.0.6, vilket är mildt med tanke på att versionen släpptes i början av 2003. Du är bra.

Jag grävde lite extra, faktiskt NEWS när jag läste ut den senaste källkoden. Version 4.6 har en ny funktion, –debug som dumpar skriptet och kommenterar utdatarader. Detta gör att du kan översätta sed -skript som genereras av funktioner i bash till kanonisk form. Häftigt! Glöm bara inte att du behöver en sed version som förgrenar sig i bash. Det är där detta sediga exempel spelar in.

Exempel 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 det för att ta bort alla HTML -taggar från den senaste artikeln jag skrev.

Kommandon

strip-taggar()
{
sed -Och 's /†*.// g'-
}
curl https://linuxhint.com/bash_cut_command/ --tyst |strip-taggar

Jag kan inte säga att det är perfekt men åtminstone är det läsbart i terminalen.

Sed exempel med arbetsflöden: Exempel arbetsflöde: ersätt säkert alla med hjälp av hitta, grep och sed

Det är säkert att säga att ändringar som görs med sed med alternativet -i är irreversibla. Det är om du inte är helt säker på vilken text som ska ersättas, kommer du sannolikt att få ett tecken mindre än avsett. Det är därför som vi i detta exempel använder sed i ett arbetsflöde för att säkert ersätta text i alla filer du har valt.

Arbetsflöde

  1. hitta
  2. grepp
  3. sed
hitta

Här väljer du vilka filer som ska bytas ut. Jag föreslår att du använder ett kommando enligt dessa linjer:

hitta -typf-namn | grepp -v-Och| xargs-jag ...

Till exempel kanske du vill begränsa filerna till att ersätta PHP -filer, exklusive git -arkivkataloger enligt följande.

hitta -typf-namn*.php| grepp -v -Och '.gå' | xargs -i...

Läs mer om kommandot xargs i bash.

grepp

Därefter ska vi försöka matcha some_pattern i filerna som valts enligt följande. Observera att eftersom vi använder alternativet -o för grep, kommer utdata bara att visa matchad sträng om någon.

hitta -typf-namn*.php| grepp -v -Och '.gå' |
xargs -i grepp -Ochnågot_mönster-eller

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 -typf-namn*.php| grepp -v -Och '.gå' |
xargs -i sed -i -Ochs/något_mönster/ersättning/g

Kommandot grep blir sed -i och alternativet -o tas bort. Och där har du det.

Nu kan du kontrollera vilka strängar som ska ersättas med sed i förväg 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 sed exemplen som diskuteras kort.

Alternativ Beskrivning
-i Redigera på plats. Om inmatningen är en fil (inte piped in) kommer resultatet av uttryck att skriva över innehållet i filen.

Sed accepterar en

t.ex.) sed -n ...

-Och -e står för uttryck. Dess parameter är ett uttryck i 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 en utskriftssats på sed -språket, kommer rader som inte ingår i utskriftsuttalandet inte att inkluderas 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
  • grepp
  • katt
  • NS
  • tee

Slutnot om den efterföljande - i exempel motsvarande kommandon

Om du undrar vad som händer - tecknet i exemplet är den här anteckningen för dig. Jag lade till ett - tecken efter de flesta kommandon i exemplen för att antyda att vi förväntar oss att inmatningen ska tas emot genom ett rör. Det är,

kattnågon fil| sortera -R-| huvud -1

Men när kommandot till vänster röret är närvarande kan vi utelämna ledtråden enligt följande.

kattnågon fil| sortera -R | huvud -1

Det var vad som hände med - tecknet efter kommandon i exemplen.

Slutnoter om funktioner för installation

Om du letar, här är funktioner för installationen för ovanstående exempel. Utmatningen som erhålls med deklarera -f. Läs mer om kommandot deklar i bash för fler användningsområden.

Kommandon

ord()
{
seq 100
}
bar()
{
kastade ut ---
}
gammal-php()
{
kastade ut 'ereg ($ UA,' Bottybot ')'
}

Slutsats

Jag tyckte om att skriva Bash sed -exempel och plockade till och med några extra knep längs vägen. Sed är ett kraftfullt kommandoradsverktyg och uttrycksfullt språk för att manipulera textfiler. Om du gillade att lära dig om sed, oroa dig inte, det finns fortfarande mycket mer att beröra. Sed på.