Sett inn linje etter første treff ved hjelp av sed

Av en eller annen grunn ser jeg ikke ut til å finne et enkelt svar på dette, og jeg er litt i tidsnød for øyeblikket. Hvordan ville jeg gå om å sette inn et valg linje med tekst etter den første linjen som samsvarer med en bestemt streng ved hjelp av sed-kommandoen. Jeg har ...

CLIENTSCRIPT="foo"
CLIENTFILE="bar"

Og jeg vil sette inn en linje etter CLIENTSCRIPT=-linjen som resulterer i ...

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
Løsning

Prøv å gjøre dette ved hjelp av GNU sed:

sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

hvis du ønsker å erstatte in-place, bruker du

sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

Output

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"

Doc

Kommentarer (14)

Legg merke til standard sed-syntaks (som i POSIX, så støttet av alle samsvarende sed-implementeringer rundt omkring (GNU, OS/X, BSD, Solaris ...)):

sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file

Eller på én linje:

sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file

(-e-uttrykk (og innholdet i -f-filer) sammenføyes med nye linjer for å utgjøre sed-skriptet sed tolker).

Alternativet -i for redigering på stedet er også en GNU-utvidelse, noen andre implementasjoner (som FreeBSD's) støtter -i '' for det.

Alternativt, for portabilitet, kan du bruke perl i stedet:

perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file

Eller du kan bruke ed eller ex:

printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file
Kommentarer (4)

Jeg hadde en lignende oppgave, og klarte ikke å få den ovennevnte perl-løsningen til å fungere.

Her er min løsning:

perl -i -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\n\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf

Forklaring:

Bruker et regulært uttrykk for å søke etter en linje i filen /etc/mysql/my.cnf som bare inneholdt [mysqld] og erstattet den med

[mysqld] collation-server = utf8_unicode_ci.

som effektivt legger til collation-server = utf8_unicode_ci-linjen etter linjen som inneholder [mysqld].

Kommentarer (0)