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.