Pentru un motiv oarecare nu pot't par să găsească un răspuns direct la acest lucru și am'm pe un pic de o criza de timp de la momentul. Cum as putea sa inserezi o alegere linie de text după prima linie de potrivire un anumit șir de caractere, folosind sed
comanda. Am ...
CLIENTSCRIPT="foo"
CLIENTFILE="bar"
Și vreau să inserați o linie după CLIENTSCRIPT=
linie care rezultă în ...
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
Incearca sa faci acest lucru folosind GNU sed:
sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file
dacă doriți să înlocuiți in-place, utilizare
sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
\o
(append)Notă standard sed
sintaxă (ca în POSIX, deci acceptate de către toate conforme sed
implementări în jurul valorii de (GNU, OS/X, BSD, Solaris...)):
sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file
Sau pe o singură linie:
sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file
(-e'xpressions (și conținutul
-f'iles) sunt unite cu linii noi pentru a face sed script sed
interpretează).
A -i
opțiune în loc de editare este, de asemenea, o extensie GNU, unele alte implementări (cum ar fi FreeBSD's) sprijin `-am '' pentru asta.
Alternativ, pentru portabilitate, puteți utiliza perl
în loc:
perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file
Sau ai putea folosi " ed " sau "ex":
printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file
Sed comandă care funcționează pe MacOS (cel puțin, OS 10) și Unix deopotrivă (de exemplu. nu't nevoie de gnu sed ca Gilles' (acceptat în prezent) o nu):
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
Acest lucru funcționează în bash și poate alte coji de asemenea, că știi $'\n' evaluare citat de stil. Totul poate fi pe o singură linie și de a lucra în vechi/POSIX sed comenzi. Dacă ar exista mai multe linii de potrivire CLIENTSCRIPT="foo" (sau echivalent) și doriți să adăugați doar o linie suplimentară prima dată, puteți reface după cum urmează:
sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file
(acest lucru creează o buclă după linia de inserție cod care doar prin cicluri de restul dosarului, nu mă întorc la prima sed comanda din nou).
S-ar putea observa am adaugat un '^ *' pentru modelul de potrivire în cazul în care linia apare într-un comentariu, să zicem, sau este indentat. Sa nu 100% perfect, dar acoperă și alte situații susceptibile de a fi comun. Reglați după cum este necesar...
Aceste două soluții, de asemenea, obține în jurul problemei (pentru generice soluție pentru a adăuga o linie) că, dacă noi inserează linie conține fără șir escape backslash-uri sau caracterele care vor fi interpretate de sed și probabil nu va iesi la fel, doar ca la \n
este - de exemplu. \0
ar fi prima linie de potrivire. Mai ales la îndemână, dacă aveți're adăugând o linie care vine de la o variabilă în cazul în care te'd altfel trebuie să scape totul din prima, folosind ${var//} înainte, sau un alt sed declarație etc.
Această soluție este un pic mai puțin murdar în script-uri (asta cu referire și \n nu este ușor de citit, deși), atunci când don't doriți să puneți textul de înlocuire pentru o comandă de la început de o linie, dacă să zicem, într-o funcție cu indentat linii. Am'am profitat de acea $'\n' este evaluată la un newline de la shell, nu în mod regulat '\n' un singur citat valori.
Obtinerea de suficient de mult timp, deși cred că perl/chiar awk-ar putea câștiga din cauza de a fi mai ușor de citit.
Am avut o sarcină similară, și nu a fost capabil de a obține mai sus perl soluție pentru a lucra.
Aici este soluția mea:
perl-am -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\n\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf
Explicație:
Folosește o expresie regulată pentru a căuta o linie în /etc/mysql/my.cnf care conținea numai [mysqld]
și a înlocuit-o cu
[mysqld] colaționare-server = utf8_unicode_ci
eficient adăugarea colaționare-server = utf8_unicode_ci
linie după linie conțin [mysqld]
.
Poate un pic cam târziu pentru a posta un răspuns pentru asta, dar am găsit unele dintre soluțiile de mai sus un pic greoaie.
Am încercat simplu șir de înlocuire în sed si a functionat:
sed 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file
& semn reflectă potrivite șir, și apoi adăugați \n linie nouă.
După cum sa menționat, dacă vrei să o faci, în loc de:
sed -i 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file
Un alt lucru. Puteți potrivi, folosind o expresie:
sed -i 's/CLIENTSCRIPT=.*/&\nCLIENTSCRIPT2="hello"/' file
Sper că acest lucru ajută cineva