sed(1p): Skillnad mellan sidversioner
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
Admin (diskussion | bidrag) |
||
| (En mellanliggande sidversion av samma användare visas inte) | |||
| Rad 1: | Rad 1: | ||
= sed(1p) = | |||
== PROLOG == | == PROLOG == | ||
Denna manualsida är en del av POSIX Programmer's Manual. Linux-implementationen av detta gränssnitt kan skilja sig (konsultera motsvarande Linux-manualsida för detaljer om Linux-beteende), eller så kanske gränssnittet inte är implementerat på Linux. | |||
implementationen av detta gränssnitt kan skilja sig (konsultera motsvarande | |||
Linux-manualsida för detaljer om Linux-beteende), eller så | |||
== NAMN == | == NAMN == | ||
'''sed''' — strömredigerare | |||
sed — strömredigerare | |||
== SYNOPSIS == | == SYNOPSIS == | ||
| Rad 26: | Rad 21: | ||
== BESKRIVNING == | == BESKRIVNING == | ||
Verktyget ''sed'' är en strömredigerare som läser en eller flera textfiler, gör redigeringsändringar enligt ett skript med redigeringskommandon och skriver resultatet till standardutmatning. Skriptet hämtas antingen från operandsträngen ''script'' eller från en kombination av optionsargumenten från alternativen '''-e''' ''script'' och '''-f''' ''script_file''. | |||
Verktyget sed är en strömredigerare som läser en eller flera textfiler, | |||
gör redigeringsändringar enligt ett skript | |||
skriver resultatet till standardutmatning. Skriptet hämtas antingen från | |||
operandsträngen script eller från en kombination av | |||
alternativen -e script och -f script_file. | |||
== | == FLAGGOR == | ||
Verktyget ''sed'' ska följa Base Definitions-delen av POSIX.1-2017, avsnitt 12.2, ''Utility Syntax Guidelines'', med undantag för att presentationsordningen för alternativen '''-e''' och '''-f''' är betydelsefull. | |||
Verktyget sed ska följa Base Definitions- | |||
Följande alternativ ska stödjas: | Följande alternativ ska stödjas: | ||
-e script | '''''-e''''' ''script'' | ||
: Lägg till redigeringskommandona som anges av optionsargumentet ''script'' sist i skriptet av redigeringskommandon. | |||
-f script_file | '''''-f''''' ''script_file'' | ||
: Lägg till redigeringskommandona i filen ''script_file'' sist i skriptet av redigeringskommandon. | |||
-n | '''''-n''''' | ||
: Undertryck standardutmatningen (där varje rad, efter att den undersökts för redigering, skrivs till standardutmatning). Endast rader som uttryckligen valts för utmatning skrivs. | |||
Om | Om någon '''-e'''- eller '''-f'''-flagga anges ska skriptet av redigeringskommandon initialt vara tomt. Kommandona som anges av varje '''-e''' eller '''-f''' läggs till i den ordning de anges. När varje tillägg görs ska, om föregående tillägg (om något) kom från en '''-e'''-flagga, ett <newline> infogas före det nya tillägget. Det resulterande skriptet ska ha samma egenskaper som operanden ''script'', beskrivet i avsnittet OPERANDER. | ||
initialt vara tomt. Kommandona som anges av varje -e | |||
ska, om föregående tillägg (om något) kom från | |||
<newline> infogas före det nya tillägget. Det resulterande skriptet ska ha | |||
samma egenskaper som operanden script, | |||
== OPERANDER == | == OPERANDER == | ||
Följande operander ska stödjas: | Följande operander ska stödjas: | ||
file | ''file'' | ||
: En sökväg till en fil vars innehåll läses och redigeras. Om flera ''file''-operander anges ska de namngivna filerna läsas i den ordning de anges och sammanfogningen redigeras. Om inga ''file''-operander anges ska standardinmatningen användas. | |||
script | ''script'' | ||
: En sträng som ska användas som skript av redigeringskommandon. Applikationen ska inte presentera ett ''script'' som bryter mot begränsningarna för en textfil, förutom att sista tecknet inte behöver vara ett <newline>. | |||
== STDIN == | == STDIN == | ||
Standardinmatningen ska användas om inga ''file''-operander anges, och ska användas om en ''file''-operand är ''''-''' och implementationen behandlar ''''-''' som standardinmatning. Annars ska standardinmatningen inte användas. Se avsnittet INDATAFILER. | |||
== INDATAFILER == | |||
Indatafilerna ska vara textfiler. ''script_file'' som namnges av '''-f''' ska bestå av redigeringskommandon. | |||
== MILJÖVARIABLER == | |||
Följande miljövariabler påverkar exekveringen av ''sed'': | |||
''LANG'' | |||
: Ger ett standardvärde för internationaliseringsvariabler som är osatta eller tomma. (Se Base Definitions-delen av POSIX.1-2017, avsnitt 8.2, ''Internationalization Variables'' för prioriteringsordningen.) | |||
''LC_ALL'' | |||
: Om satt till en icke-tom sträng åsidosätter den värdena för alla andra internationaliseringsvariabler. | |||
''LC_COLLATE'' | |||
: Bestämmer lokal för beteendet hos intervall, ekvivalensklasser och flerteckens-kollationselement i reguljära uttryck. | |||
''LC_CTYPE'' | |||
: Bestämmer lokal för tolkning av bytesekvenser i textdata som tecken (t.ex. enkelbyte vs. multibyte i argument och indatafiler), samt beteende för teckenklasser i reguljära uttryck. | |||
''LC_MESSAGES'' | |||
: Bestämmer lokal som ska användas för format och innehåll i diagnostiska meddelanden skrivna till standardfel. | |||
''NLSPATH'' | |||
: Bestämmer plats för meddelandekataloger vid bearbetning av ''LC_MESSAGES''. | |||
== ASYNKRONA HÄNDELSER == | |||
Standard. | |||
== STDOUT == | |||
Indatafilerna ska skrivas till standardutmatning, med redigeringskommandona i skriptet tillämpade. Om '''-n''' anges ska endast de indatarader som väljs av skriptet skrivas till standardutmatning. | |||
== STDERR == | |||
Standardfel ska endast användas för diagnostik- och varningsmeddelanden. | |||
== UTFILER == | |||
Utdatafilerna ska vara textfiler vars format beror på de angivna redigeringskommandona. | |||
== UTVIDGAD BESKRIVNING == | |||
Skriptet ''script'' ska bestå av redigeringskommandon på följande form: | |||
<pre> | <pre> | ||
[address[,address]]function | |||
</pre> | </pre> | ||
== | där ''function'' representerar ett kommandoverb med ett tecken från listan i ''Editing Commands in sed'', följt av eventuella argument. | ||
Kommandot kan föregås av <blank>-tecken och/eller <semicolon>-tecken. Funktionen kan föregås av <blank>-tecken. Dessa valfria tecken ska inte ha någon effekt. | |||
Vid standardkörning ska ''sed'' cykliskt lägga till en indatarad, utan dess avslutande <newline>-tecken, i mönsterutrymmet (pattern space). Inläsning från indata ska hoppas över om ett <newline> fanns i mönsterutrymmet före ett '''D'''-kommando som avslutade föregående cykel. ''sed'' ska därefter tillämpa, i ordning, alla kommandon vars adresser väljer det mönsterutrymmet, tills ett kommando startar nästa cykel eller avslutar. Om inga kommandon uttryckligen startade en ny cykel ska, vid slutet av skriptet, mönsterutrymmet kopieras till standardutmatning (utom när '''-n''' anges) och mönsterutrymmet ska raderas. När mönsterutrymmet skrivs till standardutmatning eller en namngiven fil ska ''sed'' omedelbart följa det med ett <newline>. | |||
Vissa redigeringskommandon använder ett hållutrymme (hold space) för att spara hela eller delar av mönsterutrymmet för senare hämtning. Mönster- och hållutrymmen ska vart och ett kunna hålla minst 8192 byte. | |||
=== Adresser i sed === | |||
En adress är antingen ett decimaltal som räknar indatarader kumulativt över filer, tecknet ''''$''' som adresserar sista indataraden, eller en kontextadress (som består av ett BRE, beskrivet i ''Regular Expressions in sed'', föregånget och följt av en avgränsare, vanligen ett <slash>). | |||
Ett redigeringskommando utan adresser ska välja varje mönsterutrymme. | |||
Ett redigeringskommando med en adress ska välja varje mönsterutrymme som matchar adressen. | |||
Ett redigeringskommando med två adresser ska välja det inklusiva intervallet från första mönsterutrymmet som matchar första adressen, till och med nästa mönsterutrymme som matchar den andra. (Om den andra adressen är ett tal mindre än eller lika med radnumret för första valda raden ska endast en rad väljas.) Från första raden efter det valda intervallet ska ''sed'' åter leta efter första adressen och upprepa processen. Att utelämna endera eller båda adressdelarna i följande form ger odefinierat resultat: | |||
<pre> | <pre> | ||
[address[,address]] | |||
</pre> | </pre> | ||
== | === Reguljära uttryck i sed === | ||
''sed'' ska stödja de BRE som beskrivs i Base Definitions-delen av POSIX.1-2017, avsnitt 9.3, ''Basic Regular Expressions'', med följande tillägg: | |||
* I en kontextadress ska konstruktionen <pre>"\cBREc"</pre> där ''c'' är valfritt tecken utom <backslash> eller <newline>, vara identisk med <pre>"/BRE/"</pre>. Om tecknet som betecknas av ''c'' förekommer efter en <backslash> ska det betraktas som ett bokstavligt tecken som inte terminerar BRE. Exempel: i kontextadressen <pre>"\xabc\xdefx"</pre> står det andra ''x'' för sig självt, så BRE blir <pre>"abcxdef"</pre>. | |||
* Escape-sekvensen <pre>'\n'</pre> ska matcha ett inbäddat <newline> i mönsterutrymmet. En bokstavlig <newline> ska inte användas i BRE för en kontextadress eller i substitueringsfunktionen. | |||
* Om ett RE är tomt (dvs. inget mönster anges) ska ''sed'' bete sig som om senaste RE som användes i senaste tillämpade kommandot (antingen som adress eller del av ett substitueringskommando) angavs. | |||
=== Redigeringskommandon i sed === | |||
I följande lista över redigeringskommandon anges det maximala antalet tillåtna adresser för varje funktion med [0addr], [1addr] eller [2addr]. | |||
Argumentet ''text'' ska bestå av en eller flera rader. Varje inbäddat <newline> i texten ska föregås av en <backslash>. Andra <backslash>-tecken i texten ska tas bort och följande tecken behandlas bokstavligt. | |||
Kommandoverben '''r''' och '''w''', samt ''w''-flaggan till '''s'''-kommandot, tar en parameter ''rfile'' (eller ''wfile''), separerad från kommandobokstaven/flaggan med ett eller flera <blank>-tecken; implementationer kan tillåta noll separation som en utökning. | |||
Argumentet ''rfile'' eller ''wfile'' ska avsluta redigeringskommandot. Varje ''wfile'' ska skapas innan bearbetning börjar. Implementationer ska stödja minst tio ''wfile''-argument i skriptet; det faktiska antalet (≥10) är ospecificerat. Användning av ''wfile'' ska skapa filen initialt om den inte finns, eller ersätta innehållet i en befintlig fil. | |||
Kommandoverben '''b''', '''r''', '''s''', '''t''', '''w''', '''y''' och ''' : ''' ska acceptera ytterligare argument. Följande synopsis anger vilka argument som ska separeras från kommandobokstaven med ett enda <space>. | |||
Kommandona '''a''' och '''r''' schemalägger text för senare utmatning. Texten för '''a''' och innehållet i filen för '''r''' ska skrivas till standardutmatning precis före nästa försök att hämta en indatarad vid exekvering av '''N''' eller '''n''', eller när skriptet tar slut. Om detta sker vid slutet av skriptet och '''-n''' inte angetts, ska texten skrivas efter att mönsterutrymmet kopierats till standardutmatning. Innehållet i filen för '''r''' ska vara som vid tiden då utmatningen skrivs, inte när '''r'''-kommandot tillämpas. Texten ska matas ut i den ordning som '''a''' och '''r''' tillämpades på indata. | |||
Redigeringskommandon andra än '''{...}''', '''a''', '''b''', '''c''', '''i''', '''r''', '''t''', '''w''', ''':''', och '''#''' kan följas av ett <semicolon>, valfria <blank>-tecken och ett annat redigeringskommando. Men om ett '''s'''-kommando används med ''w''-flaggan ger det odefinierat resultat att följa det av ett annat kommando på detta sätt. | |||
En funktion kan föregås av tecknet '''!''', i vilket fall funktionen ska tillämpas om adresserna inte väljer mönsterutrymmet. Noll eller fler <blank>-tecken ska accepteras före '''!'''. Det är ospecificerat om <blank>-tecken kan följa '''!''', och konforma applikationer ska inte följa '''!''' med <blank>-tecken. | |||
Om ett ''label''-argument (till '''b''', '''t''' eller ''' : ''') innehåller tecken utanför den portabla filnamnsteckenuppsättningen, eller om ''label'' är längre än 8 byte, är beteendet ospecificerat. Implementationer ska stödja ''label''-argument som är unika åtminstone upp till 8 byte; den faktiska längden (≥8) som stöds är ospecificerad. Det är ospecificerat om överskridande av maximal label-längd orsakar fel eller tyst trunkering. | |||
Nedan följer kommandon (som i originaltexten), med adressklass i hakparentes: | |||
<pre> | <pre> | ||
[2addr] { | |||
editing command | |||
... | |||
} | |||
</pre> | |||
'''''[2addr] {''''' | |||
: Exekvera en lista av ''sed''-kommandon endast när mönsterutrymmet väljs. Listan ska omges av klamrar. Klamrarna kan föregås eller följas av <blank>-tecken. <right-brace> ska föregås av <newline> eller <semicolon> (före eventuella <blank>-tecken före <right-brace>). Varje kommando i listan ska avslutas av <newline> eller av <semicolon> om det är tillåtet utanför klamrarna. Kommandon kan föregås av <blank>-tecken men ska inte följas av <blank>-tecken. | |||
<pre> | |||
[1addr]a\ | |||
text | |||
</pre> | |||
'''''[1addr]a''''' | |||
: Skriv text till standardutmatning som beskrivet ovan. | |||
<pre> | |||
[2addr]b [label] | |||
</pre> | |||
'''''[2addr]b [label]''''' | |||
: Förgrena till kommandot ''':''' som bär argumentet ''label''. Om ''label'' inte anges, förgrena till slutet av skriptet. | |||
<pre> | |||
[2addr]c\ | |||
text | |||
</pre> | </pre> | ||
'''''[2addr]c''''' | |||
: Radera mönsterutrymmet. Med 0 eller 1 adress eller vid slutet av ett 2-adressintervall, lägg ''text'' på utmatningen och starta nästa cykel. | |||
'''''[2addr]d''''' | |||
: Radera mönsterutrymmet och starta nästa cykel. | |||
'''''[2addr]D''''' | |||
: Om mönsterutrymmet inte innehåller <newline>, radera mönsterutrymmet och starta en normal ny cykel som om '''d'''-kommandot givits. Annars: radera det initiala segmentet av mönsterutrymmet genom första <newline> och starta nästa cykel med återstående mönsterutrymme utan att läsa ny indata. | |||
'''''[2addr]g''''' | |||
: Ersätt innehållet i mönsterutrymmet med innehållet i hållutrymmet. | |||
'''''[2addr]G''''' | |||
: Lägg till i mönsterutrymmet ett <newline> följt av innehållet i hållutrymmet. | |||
'''''[2addr]h''''' | |||
: Ersätt innehållet i hållutrymmet med innehållet i mönsterutrymmet. | |||
'''''[2addr]H''''' | |||
: Lägg till i hållutrymmet ett <newline> följt av innehållet i mönsterutrymmet. | |||
<pre> | <pre> | ||
[1addr]i\ | |||
text | |||
</pre> | </pre> | ||
= | '''''[1addr]i''''' | ||
: Skriv ''text'' till standardutmatning. | |||
'''''[2addr]l''''' (bokstaven ell) | |||
: Skriv mönsterutrymmet till standardutmatning i en visuellt entydig form. Tecknen i POSIX.1-2017 Base Definitions, Tabell 5-1, ''Escape Sequences and Associated Actions'' ('''\''', '''\a''', '''\b''', '''\f''', '''\r''', '''\t''', '''\v''') ska skrivas som motsvarande escape-sekvens; '''\n''' i tabellen är inte tillämpligt. Icke-utskrivbara tecken som inte finns i tabellen ska skrivas som ett tresiffrigt oktaltal (med föregående <backslash>) för varje byte i tecknet (mest signifikanta byte först). Långa rader ska vikas, där vikpunkten markeras genom att skriva en <backslash> följt av <newline>; längden där vikning sker är ospecificerad men bör vara lämplig för utdataenheten. Slutet av varje rad markeras med '''$'''. | |||
'''''[2addr]n''''' | |||
: Skriv mönsterutrymmet till standardutmatning om standardutmatningen inte undertryckts och ersätt mönsterutrymmet med nästa indatarad utan dess avslutande <newline>. Om ingen nästa indatarad finns ska '''n''' förgrena till slutet av skriptet och avsluta utan att starta en ny cykel. | |||
'''''[2addr]N''''' | |||
: Lägg till nästa indatarad utan dess avslutande <newline> till mönsterutrymmet, med ett inbäddat <newline> som separator. Observera att aktuellt radnummer ändras. Om ingen nästa indatarad finns ska '''N''' förgrena till slutet av skriptet och avsluta utan att starta ny cykel eller kopiera mönsterutrymmet till standardutmatning. | |||
'''''[2addr]p''''' | |||
: Skriv mönsterutrymmet till standardutmatning. | |||
'''''[2addr]P''''' | |||
: Skriv mönsterutrymmet, fram till första <newline>, till standardutmatning. | |||
'''''[1addr]q''''' | |||
: Förgrena till slutet av skriptet och avsluta utan att starta en ny cykel. | |||
'''''[1addr]r rfile''''' | |||
: Kopiera innehållet i ''rfile'' till standardutmatning som beskrivet ovan. Om ''rfile'' inte finns eller inte kan läsas ska den behandlas som en tom fil utan fel. | |||
'''''[2addr]s/BRE/replacement/flags''''' | |||
: Ersätt ''replacement'' för förekomster av BRE i mönsterutrymmet. Valfritt tecken (utom <backslash> eller <newline>) kan användas istället för <slash> som avgränsare. Inom BRE och replacement kan avgränsartecknet användas bokstavligt om det föregås av <backslash>. | |||
: Replacement-strängen skannas från början till slut. Ett <ampersand> ('''&''') i replacement ersätts av strängen som matchar BRE. Denna specialbetydelse kan undertryckas med <backslash> före '''&'''. Tecknen <pre>"\n"</pre> där ''n'' är en siffra ersätts av texten som matchas av motsvarande bakreferens. Om bakreferensen inte matchar ersätts <pre>"\n"</pre> av tom sträng. Specialbetydelsen kan undertryckas med <backslash>. För varje annan <backslash> förlorar följande tecken sin specialbetydelse (om någon). | |||
: En rad kan delas genom att substituera in ett <newline>. Applikationen ska escapa <newline> i replacement genom att föregå det med <backslash>. | |||
: Betydelsen av ett oescapat <backslash> följt av ett tecken annat än '''&''', <backslash>, en siffra, <newline> eller avgränsartecknet för kommandot är ospecificerad. | |||
: En substitution anses utförd även om replacement är identisk med det som ersätts. <backslash> som används för att ändra standardbetydelsen hos ett efterföljande tecken ska kasseras från BRE eller replacement innan BRE utvärderas eller replacement används. | |||
: ''flags'' är noll eller fler av: | |||
:: ''n'' — substituera endast den ''n'':te förekomsten av BRE i mönsterutrymmet. | |||
:: '''g''' — globalt: substituera alla icke-överlappande förekomster istället för bara första. Om både '''g''' och ''n'' anges är resultatet ospecificerat. | |||
:: '''p''' — skriv mönsterutrymmet till standardutmatning om en ersättning gjordes. | |||
:: '''w''' ''wfile'' — skriv: lägg till mönsterutrymmet till ''wfile'' om en ersättning gjordes. En konform applikation ska föregå ''wfile'' med ett eller fler <blank>-tecken. Om '''w'''-flaggan inte är sista flaggvärdet i en sammanfogning av flera flaggor är resultatet odefinierat. | |||
'''''[2addr]t [label]''''' | |||
: Test: förgrena till kommandot ''':''' med ''label'' om någon substitution gjorts sedan senaste inläsning av en indatarad eller exekvering av ett '''t'''. Om ''label'' inte anges, förgrena till slutet av skriptet. | |||
'''''[2addr]w wfile''''' | |||
: Lägg till (skriv) mönsterutrymmet till ''wfile''. | |||
'''''[2addr]x''''' | |||
: Byt innehållet i mönster- och hållutrymmen. | |||
'''''[2addr]y/string1/string2/''''' | |||
: Ersätt alla förekomster av tecken i ''string1'' med motsvarande tecken i ''string2''. Om en <backslash> följd av '''n''' förekommer i ''string1'' eller ''string2'' hanteras de två tecknen som ett enda <newline>. Om antalet tecken i ''string1'' och ''string2'' inte är lika, eller om något tecken i ''string1'' förekommer mer än en gång, är resultatet odefinierat. Valfritt tecken (utom <backslash> eller <newline>) kan användas istället för <slash> som avgränsare. Om avgränsaren inte är '''n''', kan avgränsaren användas bokstavligt i ''string1'' och ''string2'' om den föregås av <backslash>. Om ett <backslash> omedelbart följs av ett <backslash> i ''string1'' eller ''string2'', räknas de två som ett bokstavligt <backslash>. Betydelsen av <backslash> följt av tecken som inte är '''n''', <backslash> eller avgränsaren är odefinierad. | |||
'''''[0addr]:label''''' | |||
: Gör ingenting. Detta kommando bär ''label'' som '''b''' och '''t''' kan förgrena till. | |||
'''''[1addr]= ''''' | |||
: Skriv följande till standardutmatning: | |||
<pre> | <pre> | ||
"%d\n", <current line number> | |||
</pre> | </pre> | ||
== | '''''[0addr]''''' | ||
: Ignorera detta tomma kommando. | |||
'''''[0addr]#''''' | |||
: Ignorera '''#''' och resten av raden (behandla som kommentar), med enda undantaget att om de två första tecknen i skriptet är <pre>"#n"</pre> så ska standardutmatningen undertryckas; detta är ekvivalent med '''-n''' på kommandoraden. | |||
== AVSLUTSTATUS == | |||
Följande returvärden ska returneras: | |||
0 | |||
: Lyckad körning. | |||
>0 | |||
: Ett fel inträffade. | |||
== KONSEKVENSER AV FEL == | |||
Standard. | |||
''Följande avsnitt är informativa.'' | |||
== PROGRAMANVÄNDNING == | |||
Reguljära uttryck matchar hela strängar, inte bara enskilda rader, men ett <newline> matchas av <pre>'\n'</pre> i ett ''sed''-RE; ett <newline> är inte tillåtet av den generella definitionen av reguljärt uttryck i POSIX.1-2008. Observera också att <pre>'\n'</pre> inte kan användas för att matcha ett <newline> i slutet av en godtycklig indatarad; <newline>-tecken förekommer i mönsterutrymmet som resultat av redigeringskommandot '''N'''. | |||
När ''sed'' används för att bearbeta sökvägar rekommenderas att LC_ALL, eller åtminstone LC_CTYPE och LC_COLLATE, sätts till POSIX eller C i miljön, eftersom sökvägar kan innehålla bytesekvenser som inte bildar giltiga tecken i vissa lokaler; i så fall blir verktygets beteende odefinierat. I POSIX-lokalen är varje byte ett giltigt enkelbyte-tecken, och problemet undviks därför. | |||
== EXEMPEL == | |||
Detta ''sed''-skript simulerar BSD-kommandot ''cat'' '''-s''' och pressar ihop överflödiga tomrader från standardinmatningen: | |||
<pre> | <pre> | ||
sed -n ' | |||
# Write non-empty lines. | |||
/./ { | |||
p | |||
d | |||
} | |||
# Write a single empty line, then look for more empty lines. | |||
/^$/ p | |||
# Get next line, discard the held <newline> (empty line), | |||
# and look for more empty lines. | |||
:Empty | |||
/^$/ { | |||
N | |||
s/.// | |||
b Empty | |||
} | |||
# Write the non-empty line before going back to search | |||
# for the first in a set of empty lines. | |||
p | |||
' | |||
</pre> | </pre> | ||
Följande ''sed''-kommando är en mycket enklare metod för att pressa ihop tomrader, även om det inte är exakt samma som ''cat'' '''-s''' eftersom det tar bort inledande tomrader: | |||
<pre> | <pre> | ||
sed -n '/./,/^$/p' | |||
</pre> | </pre> | ||
== | == MOTIVERING == | ||
Denna del av POSIX.1-2017 kräver att implementationer stödjer minst tio distinkta ''wfile'':er, vilket matchar historisk praxis på många implementationer. Implementationer uppmuntras att stödja fler, men konforma applikationer bör inte överskrida denna gräns. | |||
Exitstatuskoderna här skiljer sig från System V. System V returnerar 2 för trasiga ''sed''-kommandon, men returnerar noll tillsammans med sitt användningsmeddelande eller om indatafilen inte kunde öppnas. Standardutvecklarna ansåg detta vara en bugg. | |||
Sättet som '''l'''-kommandot skriver icke-utskrivbara tecken ändrades för att undvika den historiska metoden med backspace-overstrike, och andra krav för att uppnå entydig utmatning lades till. Se MOTIVERING för [[ed(1p)]] för detaljer om formatvalet, vilket är samma som för ''sed''. | |||
Denna del av POSIX.1-2017 kräver mönster- och hållutrymmen på minst 8192 byte, större än 4000 byte som vissa historiska implementationer använde, men mindre än 20480 byte som användes i ett tidigt förslag. Implementationer uppmuntras att dynamiskt kunna allokera större utrymmen vid behov. | |||
Kraven för acceptans av <blank> och <space> i kommandorader har gjorts mer explicita än i tidiga förslag för att tydligt beskriva historisk praxis och minska förvirring kring formuleringen ”protect initial blanks [sic] and tabs from the stripping that is done on every script line” som förekommer i mycket historisk dokumentation om ''sed'' och textbeskrivningen. (Inte alla implementationer är kända för att ha strippat <blank> från textrader, men de har tillåtit inledande <blank> före adressen.) | |||
Hanteringen av '''#'''-kommentarer skiljer sig från SVID som endast tillåter kommentar som första raden i skriptet, men matchar BSD-deriverade implementationer. Kommentartecknet behandlas som ett kommando och har samma egenskaper vad gäller att accepteras med inledande <blank>; BSD-implementationen har historiskt stött detta. | |||
Tidiga förslag krävde att en ''script_file'' skulle ha minst en icke-kommentarrad. Vissa historiska implementationer har betett sig oväntat om så inte var fallet. Standardutvecklarna ansåg detta vara felaktigt och att applikationsutvecklare inte ska behöva undvika funktionen. En korrekt implementation av POSIX.1-2017 ska tillåta ''script_file'' som endast består av kommentarrader. | |||
Tidiga förslag angav att om '''-e''' och '''-f''' blandades så behandlades alla '''-e''' före '''-f'''. Detta har ändrats till att processa i angiven ordning eftersom det matchar historisk praxis och är mer intuitivt. | |||
Hanteringen av '''p'''-flaggan till '''s''' skiljer sig mellan System V och BSD-baserade system när standardutmatning är undertryckt. I exemplen: | |||
<pre> | <pre> | ||
echo a | sed 's/a/A/p' | |||
echo a | sed -n 's/a/A/p' | |||
</pre> | |||
anger POSIX.1-2017, BSD, System V-dokumentation och SVID att första exemplet ska skriva två rader med '''A''', medan det andra ska skriva en. Vissa System V-system skriver bara '''A''' en gång i båda exemplen eftersom '''p'''-flaggan ignoreras om '''-n''' inte anges. | |||
Detta var en diametral skillnad mellan system som inte kunde lösas genom att deklarera beteendet som ospecificerat. SVID/BSD/System V-beteendet antogs för POSIX.1-2017 eftersom: | |||
* Ingen känd historisk dokumentation beskriver interaktionen mellan '''p'''-flaggan och '''-n'''. | |||
* Det valda beteendet är mer korrekt eftersom det inte finns någon teknisk motivering för en sådan interaktion. En relation mellan '''-n''' och '''p''' skulle kunna antyda att de bara används tillsammans, men det ignorerar giltiga skript som bryter cykeln med '''D''', '''d''', '''q''' eller branch-kommandon. Sådana skript förlitar sig på '''p'''-suffix för att skriva mönsterutrymmet eftersom de inte använder standardutmatningen längst ned i skriptet. | |||
* Eftersom '''-n''' gör '''p''' överflödig, skulle en interaktion bara vara användbar om ''sed''-skript var skrivna för att köras både med och utan '''-n'''. Det bedöms som osannolikt. Det är ännu mer osannolikt att programmerare har kodat '''p''' i tron att den är onödig. Eftersom interaktionen inte var dokumenterad minskar sannolikheten ytterligare att någon upptäckt och förlitat sig på den. | |||
* Skript som går sönder under det specificerade beteendet producerar för mycket output istället för för lite, vilket är lättare att diagnostisera och rätta. | |||
Formen av substitutionskommandot som använder ''n''-suffix begränsades till de första 512 matchningarna i ett tidigt förslag. Den begränsningen har tagits bort eftersom det inte finns skäl att en redigerare som bearbetar rader av {LINE_MAX}-längd skulle ha en sådan restriktion. Kommandot <pre>s/a/A/2047</pre> ska kunna substituera den 2047:e förekomsten av '''a''' på en rad. | |||
Kommandona '''b''', '''t''' och ''' : ''' dokumenteras som att ignorera inledande blanktecken, men inget sägs om efterföljande blanktecken. Historiska implementationer har tilldelat olika platser åt etiketterna '''x''' och <pre>"x "</pre>. Detta är inte nyttigt och leder till subtila programmeringsfel, men det är historisk praxis och en ändring skulle teoretiskt kunna bryta fungerande skript. Implementatörer uppmuntras att ge varningar om etiketter som aldrig refereras av '''b''' eller '''t''', hopp till etiketter som inte finns, och label-argument som riskerar trunkering. | |||
Tidigare versioner av denna standard tillät implementationer med bytes som inte var åtta bitar, men detta har ändrats i denna version. | |||
== FRAMTIDA RIKTNINGAR == | |||
Inga. | |||
== SE ÄVEN == | == SE ÄVEN == | ||
[[awk(1p)]], [[ed(1p)]], [[grep(1p)]] | [[awk(1p)]], [[ed(1p)]], [[grep(1p)]] | ||
Base Definitions- | Base Definitions-delen av POSIX.1-2017: Tabell 5-1 ''Escape Sequences and Associated Actions'', Kapitel 8 ''Environment Variables'', Avsnitt 9.3 ''Basic Regular Expressions'', Avsnitt 12.2 ''Utility Syntax Guidelines'' | ||
Associated Actions, Kapitel 8 | |||
Regular Expressions, Avsnitt 12.2 | == UPPHOVSRÄTT == | ||
Delar av denna text är återtryckta och reproducerade i elektronisk form från IEEE Std 1003.1-2017, ''Standard for Information Technology — Portable Operating System Interface (POSIX)'', The Open Group Base Specifications Issue 7, 2018 Edition, copyright (C) 2018 av Institute of Electrical and Electronics Engineers, Inc och The Open Group. Vid avvikelse mellan denna version och originalstandarden är originalet från IEEE och The Open Group referensdokument. Originalstandarden kan erhållas online från The Open Group. | |||
Eventuella typografiska eller formateringsfel som förekommer på denna sida har sannolikt introducerats vid konverteringen av källfilerna till man-sidesformat. För att rapportera sådana fel, se dokumentationen om rapportering av buggar för man-pages-projektet. | |||
= Sidslut = | |||
Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man1/sed.1p.html | |||
<HR> | |||
Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på | |||
https://www.linux.se/kontaka-linux-se/ | |||
<BR><BR>Tack till [https://datorhjalp.se Datorhjälp Stockholm] som har sponsrat [https://www.linux.se Linux.se] med webbhotell. | |||
[[ | [[Kategori:Linuxmanual grupp 1]] | ||
[[ | [[Kategori:Linuxmanual]] | ||
Nuvarande version från 10 januari 2026 kl. 07.44
sed(1p)
PROLOG
Denna manualsida är en del av POSIX Programmer's Manual. Linux-implementationen av detta gränssnitt kan skilja sig (konsultera motsvarande Linux-manualsida för detaljer om Linux-beteende), eller så kanske gränssnittet inte är implementerat på Linux.
NAMN
sed — strömredigerare
SYNOPSIS
sed [-n] script [file...] sed [-n] -e script [-e script]... [-f script_file]... [file...] sed [-n] [-e script]... -f script_file [-f script_file]... [file...]
BESKRIVNING
Verktyget sed är en strömredigerare som läser en eller flera textfiler, gör redigeringsändringar enligt ett skript med redigeringskommandon och skriver resultatet till standardutmatning. Skriptet hämtas antingen från operandsträngen script eller från en kombination av optionsargumenten från alternativen -e script och -f script_file.
FLAGGOR
Verktyget sed ska följa Base Definitions-delen av POSIX.1-2017, avsnitt 12.2, Utility Syntax Guidelines, med undantag för att presentationsordningen för alternativen -e och -f är betydelsefull.
Följande alternativ ska stödjas:
-e script
- Lägg till redigeringskommandona som anges av optionsargumentet script sist i skriptet av redigeringskommandon.
-f script_file
- Lägg till redigeringskommandona i filen script_file sist i skriptet av redigeringskommandon.
-n
- Undertryck standardutmatningen (där varje rad, efter att den undersökts för redigering, skrivs till standardutmatning). Endast rader som uttryckligen valts för utmatning skrivs.
Om någon -e- eller -f-flagga anges ska skriptet av redigeringskommandon initialt vara tomt. Kommandona som anges av varje -e eller -f läggs till i den ordning de anges. När varje tillägg görs ska, om föregående tillägg (om något) kom från en -e-flagga, ett <newline> infogas före det nya tillägget. Det resulterande skriptet ska ha samma egenskaper som operanden script, beskrivet i avsnittet OPERANDER.
OPERANDER
Följande operander ska stödjas:
file
- En sökväg till en fil vars innehåll läses och redigeras. Om flera file-operander anges ska de namngivna filerna läsas i den ordning de anges och sammanfogningen redigeras. Om inga file-operander anges ska standardinmatningen användas.
script
- En sträng som ska användas som skript av redigeringskommandon. Applikationen ska inte presentera ett script som bryter mot begränsningarna för en textfil, förutom att sista tecknet inte behöver vara ett <newline>.
STDIN
Standardinmatningen ska användas om inga file-operander anges, och ska användas om en file-operand är '- och implementationen behandlar '- som standardinmatning. Annars ska standardinmatningen inte användas. Se avsnittet INDATAFILER.
INDATAFILER
Indatafilerna ska vara textfiler. script_file som namnges av -f ska bestå av redigeringskommandon.
MILJÖVARIABLER
Följande miljövariabler påverkar exekveringen av sed:
LANG
- Ger ett standardvärde för internationaliseringsvariabler som är osatta eller tomma. (Se Base Definitions-delen av POSIX.1-2017, avsnitt 8.2, Internationalization Variables för prioriteringsordningen.)
LC_ALL
- Om satt till en icke-tom sträng åsidosätter den värdena för alla andra internationaliseringsvariabler.
LC_COLLATE
- Bestämmer lokal för beteendet hos intervall, ekvivalensklasser och flerteckens-kollationselement i reguljära uttryck.
LC_CTYPE
- Bestämmer lokal för tolkning av bytesekvenser i textdata som tecken (t.ex. enkelbyte vs. multibyte i argument och indatafiler), samt beteende för teckenklasser i reguljära uttryck.
LC_MESSAGES
- Bestämmer lokal som ska användas för format och innehåll i diagnostiska meddelanden skrivna till standardfel.
NLSPATH
- Bestämmer plats för meddelandekataloger vid bearbetning av LC_MESSAGES.
ASYNKRONA HÄNDELSER
Standard.
STDOUT
Indatafilerna ska skrivas till standardutmatning, med redigeringskommandona i skriptet tillämpade. Om -n anges ska endast de indatarader som väljs av skriptet skrivas till standardutmatning.
STDERR
Standardfel ska endast användas för diagnostik- och varningsmeddelanden.
UTFILER
Utdatafilerna ska vara textfiler vars format beror på de angivna redigeringskommandona.
UTVIDGAD BESKRIVNING
Skriptet script ska bestå av redigeringskommandon på följande form:
[address[,address]]function
där function representerar ett kommandoverb med ett tecken från listan i Editing Commands in sed, följt av eventuella argument.
Kommandot kan föregås av <blank>-tecken och/eller <semicolon>-tecken. Funktionen kan föregås av <blank>-tecken. Dessa valfria tecken ska inte ha någon effekt.
Vid standardkörning ska sed cykliskt lägga till en indatarad, utan dess avslutande <newline>-tecken, i mönsterutrymmet (pattern space). Inläsning från indata ska hoppas över om ett <newline> fanns i mönsterutrymmet före ett D-kommando som avslutade föregående cykel. sed ska därefter tillämpa, i ordning, alla kommandon vars adresser väljer det mönsterutrymmet, tills ett kommando startar nästa cykel eller avslutar. Om inga kommandon uttryckligen startade en ny cykel ska, vid slutet av skriptet, mönsterutrymmet kopieras till standardutmatning (utom när -n anges) och mönsterutrymmet ska raderas. När mönsterutrymmet skrivs till standardutmatning eller en namngiven fil ska sed omedelbart följa det med ett <newline>.
Vissa redigeringskommandon använder ett hållutrymme (hold space) för att spara hela eller delar av mönsterutrymmet för senare hämtning. Mönster- och hållutrymmen ska vart och ett kunna hålla minst 8192 byte.
Adresser i sed
En adress är antingen ett decimaltal som räknar indatarader kumulativt över filer, tecknet '$ som adresserar sista indataraden, eller en kontextadress (som består av ett BRE, beskrivet i Regular Expressions in sed, föregånget och följt av en avgränsare, vanligen ett <slash>).
Ett redigeringskommando utan adresser ska välja varje mönsterutrymme.
Ett redigeringskommando med en adress ska välja varje mönsterutrymme som matchar adressen.
Ett redigeringskommando med två adresser ska välja det inklusiva intervallet från första mönsterutrymmet som matchar första adressen, till och med nästa mönsterutrymme som matchar den andra. (Om den andra adressen är ett tal mindre än eller lika med radnumret för första valda raden ska endast en rad väljas.) Från första raden efter det valda intervallet ska sed åter leta efter första adressen och upprepa processen. Att utelämna endera eller båda adressdelarna i följande form ger odefinierat resultat:
[address[,address]]
Reguljära uttryck i sed
sed ska stödja de BRE som beskrivs i Base Definitions-delen av POSIX.1-2017, avsnitt 9.3, Basic Regular Expressions, med följande tillägg:
- I en kontextadress ska konstruktionen
"\cBREc"
där c är valfritt tecken utom <backslash> eller <newline>, vara identisk med"/BRE/"
. Om tecknet som betecknas av c förekommer efter en <backslash> ska det betraktas som ett bokstavligt tecken som inte terminerar BRE. Exempel: i kontextadressen"\xabc\xdefx"
står det andra x för sig självt, så BRE blir"abcxdef"
.
- Escape-sekvensen
'\n'
ska matcha ett inbäddat <newline> i mönsterutrymmet. En bokstavlig <newline> ska inte användas i BRE för en kontextadress eller i substitueringsfunktionen.
- Om ett RE är tomt (dvs. inget mönster anges) ska sed bete sig som om senaste RE som användes i senaste tillämpade kommandot (antingen som adress eller del av ett substitueringskommando) angavs.
Redigeringskommandon i sed
I följande lista över redigeringskommandon anges det maximala antalet tillåtna adresser för varje funktion med [0addr], [1addr] eller [2addr].
Argumentet text ska bestå av en eller flera rader. Varje inbäddat <newline> i texten ska föregås av en <backslash>. Andra <backslash>-tecken i texten ska tas bort och följande tecken behandlas bokstavligt.
Kommandoverben r och w, samt w-flaggan till s-kommandot, tar en parameter rfile (eller wfile), separerad från kommandobokstaven/flaggan med ett eller flera <blank>-tecken; implementationer kan tillåta noll separation som en utökning.
Argumentet rfile eller wfile ska avsluta redigeringskommandot. Varje wfile ska skapas innan bearbetning börjar. Implementationer ska stödja minst tio wfile-argument i skriptet; det faktiska antalet (≥10) är ospecificerat. Användning av wfile ska skapa filen initialt om den inte finns, eller ersätta innehållet i en befintlig fil.
Kommandoverben b, r, s, t, w, y och : ska acceptera ytterligare argument. Följande synopsis anger vilka argument som ska separeras från kommandobokstaven med ett enda <space>.
Kommandona a och r schemalägger text för senare utmatning. Texten för a och innehållet i filen för r ska skrivas till standardutmatning precis före nästa försök att hämta en indatarad vid exekvering av N eller n, eller när skriptet tar slut. Om detta sker vid slutet av skriptet och -n inte angetts, ska texten skrivas efter att mönsterutrymmet kopierats till standardutmatning. Innehållet i filen för r ska vara som vid tiden då utmatningen skrivs, inte när r-kommandot tillämpas. Texten ska matas ut i den ordning som a och r tillämpades på indata.
Redigeringskommandon andra än {...}, a, b, c, i, r, t, w, :, och # kan följas av ett <semicolon>, valfria <blank>-tecken och ett annat redigeringskommando. Men om ett s-kommando används med w-flaggan ger det odefinierat resultat att följa det av ett annat kommando på detta sätt.
En funktion kan föregås av tecknet !, i vilket fall funktionen ska tillämpas om adresserna inte väljer mönsterutrymmet. Noll eller fler <blank>-tecken ska accepteras före !. Det är ospecificerat om <blank>-tecken kan följa !, och konforma applikationer ska inte följa ! med <blank>-tecken.
Om ett label-argument (till b, t eller : ) innehåller tecken utanför den portabla filnamnsteckenuppsättningen, eller om label är längre än 8 byte, är beteendet ospecificerat. Implementationer ska stödja label-argument som är unika åtminstone upp till 8 byte; den faktiska längden (≥8) som stöds är ospecificerad. Det är ospecificerat om överskridande av maximal label-längd orsakar fel eller tyst trunkering.
Nedan följer kommandon (som i originaltexten), med adressklass i hakparentes:
[2addr] {
editing command
...
}
[2addr] {
- Exekvera en lista av sed-kommandon endast när mönsterutrymmet väljs. Listan ska omges av klamrar. Klamrarna kan föregås eller följas av <blank>-tecken. <right-brace> ska föregås av <newline> eller <semicolon> (före eventuella <blank>-tecken före <right-brace>). Varje kommando i listan ska avslutas av <newline> eller av <semicolon> om det är tillåtet utanför klamrarna. Kommandon kan föregås av <blank>-tecken men ska inte följas av <blank>-tecken.
[1addr]a\ text
[1addr]a
- Skriv text till standardutmatning som beskrivet ovan.
[2addr]b [label]
[2addr]b [label]
- Förgrena till kommandot : som bär argumentet label. Om label inte anges, förgrena till slutet av skriptet.
[2addr]c\ text
[2addr]c
- Radera mönsterutrymmet. Med 0 eller 1 adress eller vid slutet av ett 2-adressintervall, lägg text på utmatningen och starta nästa cykel.
[2addr]d
- Radera mönsterutrymmet och starta nästa cykel.
[2addr]D
- Om mönsterutrymmet inte innehåller <newline>, radera mönsterutrymmet och starta en normal ny cykel som om d-kommandot givits. Annars: radera det initiala segmentet av mönsterutrymmet genom första <newline> och starta nästa cykel med återstående mönsterutrymme utan att läsa ny indata.
[2addr]g
- Ersätt innehållet i mönsterutrymmet med innehållet i hållutrymmet.
[2addr]G
- Lägg till i mönsterutrymmet ett <newline> följt av innehållet i hållutrymmet.
[2addr]h
- Ersätt innehållet i hållutrymmet med innehållet i mönsterutrymmet.
[2addr]H
- Lägg till i hållutrymmet ett <newline> följt av innehållet i mönsterutrymmet.
[1addr]i\ text
[1addr]i
- Skriv text till standardutmatning.
[2addr]l (bokstaven ell)
- Skriv mönsterutrymmet till standardutmatning i en visuellt entydig form. Tecknen i POSIX.1-2017 Base Definitions, Tabell 5-1, Escape Sequences and Associated Actions (\, \a, \b, \f, \r, \t, \v) ska skrivas som motsvarande escape-sekvens; \n i tabellen är inte tillämpligt. Icke-utskrivbara tecken som inte finns i tabellen ska skrivas som ett tresiffrigt oktaltal (med föregående <backslash>) för varje byte i tecknet (mest signifikanta byte först). Långa rader ska vikas, där vikpunkten markeras genom att skriva en <backslash> följt av <newline>; längden där vikning sker är ospecificerad men bör vara lämplig för utdataenheten. Slutet av varje rad markeras med $.
[2addr]n
- Skriv mönsterutrymmet till standardutmatning om standardutmatningen inte undertryckts och ersätt mönsterutrymmet med nästa indatarad utan dess avslutande <newline>. Om ingen nästa indatarad finns ska n förgrena till slutet av skriptet och avsluta utan att starta en ny cykel.
[2addr]N
- Lägg till nästa indatarad utan dess avslutande <newline> till mönsterutrymmet, med ett inbäddat <newline> som separator. Observera att aktuellt radnummer ändras. Om ingen nästa indatarad finns ska N förgrena till slutet av skriptet och avsluta utan att starta ny cykel eller kopiera mönsterutrymmet till standardutmatning.
[2addr]p
- Skriv mönsterutrymmet till standardutmatning.
[2addr]P
- Skriv mönsterutrymmet, fram till första <newline>, till standardutmatning.
[1addr]q
- Förgrena till slutet av skriptet och avsluta utan att starta en ny cykel.
[1addr]r rfile
- Kopiera innehållet i rfile till standardutmatning som beskrivet ovan. Om rfile inte finns eller inte kan läsas ska den behandlas som en tom fil utan fel.
[2addr]s/BRE/replacement/flags
- Ersätt replacement för förekomster av BRE i mönsterutrymmet. Valfritt tecken (utom <backslash> eller <newline>) kan användas istället för <slash> som avgränsare. Inom BRE och replacement kan avgränsartecknet användas bokstavligt om det föregås av <backslash>.
- Replacement-strängen skannas från början till slut. Ett <ampersand> (&) i replacement ersätts av strängen som matchar BRE. Denna specialbetydelse kan undertryckas med <backslash> före &. Tecknen
"\n"
där n är en siffra ersätts av texten som matchas av motsvarande bakreferens. Om bakreferensen inte matchar ersätts"\n"
av tom sträng. Specialbetydelsen kan undertryckas med <backslash>. För varje annan <backslash> förlorar följande tecken sin specialbetydelse (om någon).
- En rad kan delas genom att substituera in ett <newline>. Applikationen ska escapa <newline> i replacement genom att föregå det med <backslash>.
- Betydelsen av ett oescapat <backslash> följt av ett tecken annat än &, <backslash>, en siffra, <newline> eller avgränsartecknet för kommandot är ospecificerad.
- En substitution anses utförd även om replacement är identisk med det som ersätts. <backslash> som används för att ändra standardbetydelsen hos ett efterföljande tecken ska kasseras från BRE eller replacement innan BRE utvärderas eller replacement används.
- flags är noll eller fler av:
- n — substituera endast den n:te förekomsten av BRE i mönsterutrymmet.
- g — globalt: substituera alla icke-överlappande förekomster istället för bara första. Om både g och n anges är resultatet ospecificerat.
- p — skriv mönsterutrymmet till standardutmatning om en ersättning gjordes.
- w wfile — skriv: lägg till mönsterutrymmet till wfile om en ersättning gjordes. En konform applikation ska föregå wfile med ett eller fler <blank>-tecken. Om w-flaggan inte är sista flaggvärdet i en sammanfogning av flera flaggor är resultatet odefinierat.
[2addr]t [label]
- Test: förgrena till kommandot : med label om någon substitution gjorts sedan senaste inläsning av en indatarad eller exekvering av ett t. Om label inte anges, förgrena till slutet av skriptet.
[2addr]w wfile
- Lägg till (skriv) mönsterutrymmet till wfile.
[2addr]x
- Byt innehållet i mönster- och hållutrymmen.
[2addr]y/string1/string2/
- Ersätt alla förekomster av tecken i string1 med motsvarande tecken i string2. Om en <backslash> följd av n förekommer i string1 eller string2 hanteras de två tecknen som ett enda <newline>. Om antalet tecken i string1 och string2 inte är lika, eller om något tecken i string1 förekommer mer än en gång, är resultatet odefinierat. Valfritt tecken (utom <backslash> eller <newline>) kan användas istället för <slash> som avgränsare. Om avgränsaren inte är n, kan avgränsaren användas bokstavligt i string1 och string2 om den föregås av <backslash>. Om ett <backslash> omedelbart följs av ett <backslash> i string1 eller string2, räknas de två som ett bokstavligt <backslash>. Betydelsen av <backslash> följt av tecken som inte är n, <backslash> eller avgränsaren är odefinierad.
[0addr]:label
- Gör ingenting. Detta kommando bär label som b och t kan förgrena till.
[1addr]=
- Skriv följande till standardutmatning:
"%d\n", <current line number>
[0addr]
- Ignorera detta tomma kommando.
[0addr]#
- Ignorera # och resten av raden (behandla som kommentar), med enda undantaget att om de två första tecknen i skriptet är
"#n"
så ska standardutmatningen undertryckas; detta är ekvivalent med -n på kommandoraden.
AVSLUTSTATUS
Följande returvärden ska returneras:
0
- Lyckad körning.
>0
- Ett fel inträffade.
KONSEKVENSER AV FEL
Standard.
Följande avsnitt är informativa.
PROGRAMANVÄNDNING
Reguljära uttryck matchar hela strängar, inte bara enskilda rader, men ett <newline> matchas av
'\n'
i ett sed-RE; ett <newline> är inte tillåtet av den generella definitionen av reguljärt uttryck i POSIX.1-2008. Observera också att
'\n'
inte kan användas för att matcha ett <newline> i slutet av en godtycklig indatarad; <newline>-tecken förekommer i mönsterutrymmet som resultat av redigeringskommandot N.
När sed används för att bearbeta sökvägar rekommenderas att LC_ALL, eller åtminstone LC_CTYPE och LC_COLLATE, sätts till POSIX eller C i miljön, eftersom sökvägar kan innehålla bytesekvenser som inte bildar giltiga tecken i vissa lokaler; i så fall blir verktygets beteende odefinierat. I POSIX-lokalen är varje byte ett giltigt enkelbyte-tecken, och problemet undviks därför.
EXEMPEL
Detta sed-skript simulerar BSD-kommandot cat -s och pressar ihop överflödiga tomrader från standardinmatningen:
sed -n '
# Write non-empty lines.
/./ {
p
d
}
# Write a single empty line, then look for more empty lines.
/^$/ p
# Get next line, discard the held <newline> (empty line),
# and look for more empty lines.
:Empty
/^$/ {
N
s/.//
b Empty
}
# Write the non-empty line before going back to search
# for the first in a set of empty lines.
p
'
Följande sed-kommando är en mycket enklare metod för att pressa ihop tomrader, även om det inte är exakt samma som cat -s eftersom det tar bort inledande tomrader:
sed -n '/./,/^$/p'
MOTIVERING
Denna del av POSIX.1-2017 kräver att implementationer stödjer minst tio distinkta wfile:er, vilket matchar historisk praxis på många implementationer. Implementationer uppmuntras att stödja fler, men konforma applikationer bör inte överskrida denna gräns.
Exitstatuskoderna här skiljer sig från System V. System V returnerar 2 för trasiga sed-kommandon, men returnerar noll tillsammans med sitt användningsmeddelande eller om indatafilen inte kunde öppnas. Standardutvecklarna ansåg detta vara en bugg.
Sättet som l-kommandot skriver icke-utskrivbara tecken ändrades för att undvika den historiska metoden med backspace-overstrike, och andra krav för att uppnå entydig utmatning lades till. Se MOTIVERING för ed(1p) för detaljer om formatvalet, vilket är samma som för sed.
Denna del av POSIX.1-2017 kräver mönster- och hållutrymmen på minst 8192 byte, större än 4000 byte som vissa historiska implementationer använde, men mindre än 20480 byte som användes i ett tidigt förslag. Implementationer uppmuntras att dynamiskt kunna allokera större utrymmen vid behov.
Kraven för acceptans av <blank> och <space> i kommandorader har gjorts mer explicita än i tidiga förslag för att tydligt beskriva historisk praxis och minska förvirring kring formuleringen ”protect initial blanks [sic] and tabs from the stripping that is done on every script line” som förekommer i mycket historisk dokumentation om sed och textbeskrivningen. (Inte alla implementationer är kända för att ha strippat <blank> från textrader, men de har tillåtit inledande <blank> före adressen.)
Hanteringen av #-kommentarer skiljer sig från SVID som endast tillåter kommentar som första raden i skriptet, men matchar BSD-deriverade implementationer. Kommentartecknet behandlas som ett kommando och har samma egenskaper vad gäller att accepteras med inledande <blank>; BSD-implementationen har historiskt stött detta.
Tidiga förslag krävde att en script_file skulle ha minst en icke-kommentarrad. Vissa historiska implementationer har betett sig oväntat om så inte var fallet. Standardutvecklarna ansåg detta vara felaktigt och att applikationsutvecklare inte ska behöva undvika funktionen. En korrekt implementation av POSIX.1-2017 ska tillåta script_file som endast består av kommentarrader.
Tidiga förslag angav att om -e och -f blandades så behandlades alla -e före -f. Detta har ändrats till att processa i angiven ordning eftersom det matchar historisk praxis och är mer intuitivt.
Hanteringen av p-flaggan till s skiljer sig mellan System V och BSD-baserade system när standardutmatning är undertryckt. I exemplen:
echo a | sed 's/a/A/p' echo a | sed -n 's/a/A/p'
anger POSIX.1-2017, BSD, System V-dokumentation och SVID att första exemplet ska skriva två rader med A, medan det andra ska skriva en. Vissa System V-system skriver bara A en gång i båda exemplen eftersom p-flaggan ignoreras om -n inte anges.
Detta var en diametral skillnad mellan system som inte kunde lösas genom att deklarera beteendet som ospecificerat. SVID/BSD/System V-beteendet antogs för POSIX.1-2017 eftersom:
- Ingen känd historisk dokumentation beskriver interaktionen mellan p-flaggan och -n.
- Det valda beteendet är mer korrekt eftersom det inte finns någon teknisk motivering för en sådan interaktion. En relation mellan -n och p skulle kunna antyda att de bara används tillsammans, men det ignorerar giltiga skript som bryter cykeln med D, d, q eller branch-kommandon. Sådana skript förlitar sig på p-suffix för att skriva mönsterutrymmet eftersom de inte använder standardutmatningen längst ned i skriptet.
- Eftersom -n gör p överflödig, skulle en interaktion bara vara användbar om sed-skript var skrivna för att köras både med och utan -n. Det bedöms som osannolikt. Det är ännu mer osannolikt att programmerare har kodat p i tron att den är onödig. Eftersom interaktionen inte var dokumenterad minskar sannolikheten ytterligare att någon upptäckt och förlitat sig på den.
- Skript som går sönder under det specificerade beteendet producerar för mycket output istället för för lite, vilket är lättare att diagnostisera och rätta.
Formen av substitutionskommandot som använder n-suffix begränsades till de första 512 matchningarna i ett tidigt förslag. Den begränsningen har tagits bort eftersom det inte finns skäl att en redigerare som bearbetar rader av {LINE_MAX}-längd skulle ha en sådan restriktion. Kommandot
s/a/A/2047
ska kunna substituera den 2047:e förekomsten av a på en rad. Kommandona b, t och : dokumenteras som att ignorera inledande blanktecken, men inget sägs om efterföljande blanktecken. Historiska implementationer har tilldelat olika platser åt etiketterna x och
"x "
. Detta är inte nyttigt och leder till subtila programmeringsfel, men det är historisk praxis och en ändring skulle teoretiskt kunna bryta fungerande skript. Implementatörer uppmuntras att ge varningar om etiketter som aldrig refereras av b eller t, hopp till etiketter som inte finns, och label-argument som riskerar trunkering.
Tidigare versioner av denna standard tillät implementationer med bytes som inte var åtta bitar, men detta har ändrats i denna version.
FRAMTIDA RIKTNINGAR
Inga.
SE ÄVEN
Base Definitions-delen av POSIX.1-2017: Tabell 5-1 Escape Sequences and Associated Actions, Kapitel 8 Environment Variables, Avsnitt 9.3 Basic Regular Expressions, Avsnitt 12.2 Utility Syntax Guidelines
UPPHOVSRÄTT
Delar av denna text är återtryckta och reproducerade i elektronisk form från IEEE Std 1003.1-2017, Standard for Information Technology — Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 7, 2018 Edition, copyright (C) 2018 av Institute of Electrical and Electronics Engineers, Inc och The Open Group. Vid avvikelse mellan denna version och originalstandarden är originalet från IEEE och The Open Group referensdokument. Originalstandarden kan erhållas online från The Open Group.
Eventuella typografiska eller formateringsfel som förekommer på denna sida har sannolikt introducerats vid konverteringen av källfilerna till man-sidesformat. För att rapportera sådana fel, se dokumentationen om rapportering av buggar för man-pages-projektet.
Sidslut
Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man1/sed.1p.html
Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på
https://www.linux.se/kontaka-linux-se/
Tack till Datorhjälp Stockholm som har sponsrat Linux.se med webbhotell.