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"
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
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
\a
(vedlegg)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
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]
.