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"
223
3
Prøv å gjøre dette ved hjelp av GNU sed:
hvis du ønsker å erstatte in-place, bruker du
Output
Doc
\a
(vedlegg)Legg merke til standard
sed
-syntaks (som i POSIX, så støttet av alle samsvarendesed
-implementeringer rundt omkring (GNU, OS/X, BSD, Solaris ...)):Eller på én linje:
(
-e
-uttrykk (og innholdet i-f
-filer) sammenføyes med nye linjer for å utgjøre sed-skriptetsed
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:Eller du kan bruke
ed
ellerex
: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]
.