kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 user2150250
user2150250
Question

Inserați o linie după primul meci, cu sed

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"
223 2013-03-21T22:23:35+00:00 7
Gilles Quenot
Gilles Quenot
Întrebarea editată 21 martie 2013 в 10:30
Programare
shell
sed
Solution / Answer
Gilles Quenot
Gilles Quenot
21 martie 2013 в 10:27
2013-03-21T22:27:07+00:00
Mai mult
Sursă
Editează
#18863232

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

Ieșire

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

Doc

  • a se vedea sed doc și de căutare \o (append)
Duncan  X Simpson
Duncan X Simpson
Răspuns editat 13 iulie 2018 в 10:12
354
0
Stephane Chazelas
Stephane Chazelas
14 august 2014 в 10:53
2014-08-14T10:53:49+00:00
Mai mult
Sursă
Editează
#18863233

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
Stephane Chazelas
Stephane Chazelas
Răspuns editat 23 mai 2018 в 9:07
46
0
 SLePort
SLePort
20 decembrie 2016 в 8:51
2016-12-20T20:51:40+00:00
Mai mult
Sursă
Editează
#18863235

Un POSIX compliant folosind un singur " s " comanda:

sed '/CLIENTSCRIPT="foo"/s/.*/&\
CLIENTSCRIPT2="hello"/' file
 SLePort
SLePort
Răspuns editat 23 mai 2018 в 9:54
13
0
 Breezer
Breezer
23 ianuarie 2018 в 4:26
2018-01-23T16:26:06+00:00
Mai mult
Sursă
Editează
#18863236

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.

10
0
 Caleb
Caleb
7 iulie 2015 в 8:15
2015-07-07T20:15:03+00:00
Mai mult
Sursă
Editează
#18863234

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].

1
0
Corentin Limier
Corentin Limier
2 august 2019 в 7:40
2019-08-02T07:40:54+00:00
Mai mult
Sursă
Editează
#18863238

Awk varianta :

awk '1;/CLIENTSCRIPT=/{print "CLIENTSCRIPT2=\"hello\""}' file
1
0
 siwesam
siwesam
12 februarie 2019 в 2:06
2019-02-12T14:06:34+00:00
Mai mult
Sursă
Editează
#18863237

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

0
0
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
工藤 芳則
Înregistrat 6 zile în urmă
2
Ирина Беляева
Înregistrat 1 săptămână în urmă
3
Darya Arsenyeva
Înregistrat 1 săptămână în urmă
4
anyta nuam-nuam (LapuSiK)
Înregistrat 1 săptămână în urmă
5
Shuhratjon Imomkulov
Înregistrat 1 săptămână în urmă
DE
ES
ID
JA
KO
NO
RO
RU
TR
ZH
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire