Puncte:1

Sed pentru înlocuirea unui subșir în interiorul unui șir cu un model

drapel in

Încerc să înlocuiesc o parte a unui model, de exemplu, dacă am col(3,B,14), după aplicarea sed comanda, aș dori să primesc col(3,B,t14) care adaugă t caracter la al treilea parametru din model.

incerc cu:

s="col(3,B,14)"
echo $s | sed 's/col([0-9],[A-Z],[0-9])/col([0-9],[A-Z],t[0-9])/g'

Dar, returnează șirul original. Aș aprecia dacă ați putea da un sfat. Mulțumiri.

FedKad avatar
drapel cn
Ar trebui să utilizați referințe înapoi în șirul de înlocuire: https://www.gnu.org/software/sed/manual/html_node/Back_002dreferences-and-Subexpressions.html
CGeorgi avatar
drapel in
Multumesc FedonKadifeli, da iti urmez sfatul si am gasit solutia : echo $s | sed -E 's/col(\(.*),(.*),(.*)\)/col\1,\2,t\3)/g' folosind referințele din spate așa cum sugerați. Multumesc foarte mult.
Puncte:4
drapel in

Pari puțin confuz cu privire la modul în care funcționează sed, așa că voi merge pas cu pas. Ale mele „răspunsul” este acesta:

s="col(3,B,14)"; echo $s | sed 's/\(col([0-9],[A-Z],\)/\1t/g'

Explicaţie

Există câteva probleme aici. În primul rând, aveți nevoie de un punct și două puncte după definindu-vă variabila „s”, înainte de a-i repeta.

s="col(3,B,14)"; eco $s 

În continuare, substituția sed funcționează prin „s/pattern/replacement/” - unde „pattern” este un expresie regulată, dar unde „înlocuire” nu este. Adică a pune ceva precum „[0-9]” în înlocuire nu va reprezenta nicio cifră, ci în schimb reprezintă cele cinci personaje: [, 0, -, 9, și ]. De asemenea /g la finalul înseamnă a continua să aplici substituția pe un șir pentru fiecare meci de modelul (deci dacă ai avea o linie ca ecou salut lume | sed 's/o/z/g' atunci ieșirea ar fi „hellz wzrld”. Întrucât ecou salut lume | sed 's/o/z/' ar da „lumea iadului”)

Deci, să eliminăm înlocuitorul pentru moment:

s="col(3,B,14)"; echo $s | sed 's/col([0-9],[A-Z],[0-9])/înlocuire/g'

Îndreptând atenția către modelul de expresie regulată pe care l-ați folosit, scrie potrivire a șir precum „col(<o singură cifră>,<litera majusculă>,<o singură cifră>)” - notificări că ultimul [0-9] piesa nu se va potrivi cu „14”, deoarece sunt două cifre și așa modelul dvs. se va potrivi cu „col(3,B,1)”, dar nu se va potrivi cu „col(3,B14)”. La potriviți una sau mai multe cifre, puteți utiliza [0-9][0-9]*:

Pentru a face înlocuirea după cum doriți, cel mai bun mod ar fi să utilizați o „captură”. grup'. Grupurile de captură „își amintesc” o parte din meci pentru o utilizare ulterioară. Tu pui \( și \) în jurul părții modelului pe care doriți să o amintiți și să o utilizați \1 la consultați-l mai târziu:

s="col(3,B,14)"; echo $s | sed 's/\(col([0-9],[A-Z],\)/\1replacement/g'

Aceasta se va potrivi cu „col(<o singură cifră>,<litera majusculă>,” - deci până la și inclusiv punctul în care doriți să adăugați un „t”. Toate aceste lucruri potrivite vor fi pus înapoi în înlocuire (\1) urmată de orice text pe care îl adăugați (în acest în cazul în care adăugăm textul literal „înlocuire”). Orice text rămas nu potrivite în intrare nu vor fi afectate. Cele de mai sus vor scoate:

col(3,B,1înlocuire4)

Deci, dacă punem acum un „t” în șirul de înlocuire:

s="col(3,B,14)"; echo $s | sed 's/\(col([0-9],[A-Z],\)/\1t/g'

Primim:

col(3,B,t14)

Dacă vrei să înveți sed bine, îți pot recomanda un excelent tutorial.

CGeorgi avatar
drapel in
Multumesc mult mattb pentru explicatia detaliata. Voi citi tutorialul sed, cu siguranță.
Puncte:-2
drapel in

echo $s | sed -E 's/col(\(.*),(.*),(.*)\)/col\1,\2,t\3)/g'

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.