Am un fișier care are un cuvânt cheie RESOURCE
. Poate apărea oriunde în fișier, cum ar fi:
[email protected]
Acum vreau să înlocuiesc [email protected]
cu [email protected]
. Trebuie să caut linia unde pot găsi cuvântul cheie RESOURCE
și apoi să înlocuiesc cuvântul după semnul egal. Cuvântul cheie RESOURCE
trebuie să rămână nemodificat.
Poate cineva să mă ajute în acest sens?
input:
[email protected]
Ieșire:
[email protected]
Răspuns
grep
nu este util în acest caz, deoarece nu vă permite să modificați conținutul fișierului.
În schimb, se poate utiliza sed
așa:
fromaddr="[email protected]" toaddr="[email protected]" sed "/^RESOURCE=/s/=""$fromaddr""$/=""$toaddr""/" file >newfile
Dat file
ca
some data [email protected] [email protected] [email protected] [email protected] more data
aceasta creează newfile
ca
some data [email protected] [email protected] [email protected] [email protected] more data
sed
expresia va selecta liniile care încep cu șirul RESOURCE
. Pentru fiecare astfel de linie, va înlocui adresa de e-mail, dacă este prezentă pe linie. Modelul utilizat pentru înlocuire asigură că ne potrivim cu =
și că adresa se termină la sfârșitul rândului.
Comentarii
nu redirecționează către un fișier nou. ' m, în general, evitând utilizarea sed -i
deoarece ' nu este portabilă și, dacă faceți un tip o, poate distruge datele dvs. originale.
Răspuns
sed
comanda este mai bună.
sed -i "s/[email protected]/[email protected]/" yourfile
Cele de mai sus funcționează în testul meu, dar dacă doriți să-l testați singur, îl puteți încerca mai întâi:
sed "s/[email protected]/[email protected]/" yourfile
Aceasta va scrie modificările la ieșirea standard fără a afecta fișierul.
Oricum, vă oferă schimbarea dorită de:
[email protected]
Dacă valoarea RESOURCE
este diferită în fișier și doriți să o schimbați cu ceva diferit atunci:
grep RESOURCE= yourfile
Aceasta va returna linia unde se află și va afișa valoarea.
Apoi puteți utiliza
sed "s/[email protected]/[email protected]/" yourfile
Pentru referințe viitoare, este important să clarificați toate acestea în întrebarea dvs. inițială, astfel încât să puteți obține ajutorul de care aveți nevoie fără toate aceste rigamarole.
Comentarii
- Nu vreau să codific [email protected], ar trebui să fie ceva de genul [email protected]. Vreau să îl înlocuiesc cu oricare altul ca [email protected]. fii dinamic
- Nu ' nu înțeleg ce vrei să spui. În întrebarea dvs., arată că doriți ca rezultatul să fie
[email protected]
pe care îl obțin ambele răspunsuri. Ce vrei să spui prin: " Nu vreau să codific [email protected] "? și " ar trebui să fie dinamic "? - @Lakshminarayana Dacă doriți să efectueze modificările la fișier apoi folosiți
sed i
așa cum am dat în prima mea comandă. Testați-l mai întâi cused
singur în a doua mea comandă pentru a vă asigura că ' face ceea ce doriți și apoi utilizațised -i
în prima mea comandă odată ce ' sunteți sigur că funcționează. - Adică nu vreau să codul greu lor. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' yourfile. Vreau să-l transmit ca parametrii de intrare și de ieșire.și, de asemenea, vreau să caut acea linie în care am RESURSĂ și trebuie să o înlocuiesc. la o variabilă sau
grep RESOURCE= file
, obțineți adresa de e-mail care apare, apoi utilizațised -i
și înlocuiți[email protected]
și[email protected]
cu orice este acolo și orice vrei să fie.
Răspunde
Se pare că spui că vrei să înlocuiești șirul care apare după =
, indiferent de ce este – de exemplu , în datele eșantionului, doriți să înlocuiți [email protected]
. Dar spui că, indiferent care este șirul de după =
, vrei să îl înlocuiești cu [email protected]
– se pare că vrei care este codificat în mod dur.
Există câteva variante cu privire la modul de a face acest lucru. Cel mai simplu este
sed "s/RESOURCE=.*/[email protected]/"
care (ca toate comenzile de mai jos) folosește faptul că .*
înseamnă „potriviți orice Este acolo”. Dacă nu doriți să tastați RESOURCE=
de două ori, puteți scurta cele de mai sus la
sed "s/\(RESOURCE=\).*/\[email protected]/"
unde \(
… \)
marchează o parte a șirului de căutare ca grup (puteți avea până la nouă grupuri) și \1
înseamnă înlocuire cu primul grup.
Comenzile de mai sus vor găsi și înlocui RESOURCE=
oriunde apare pe linie. Deci, de exemplu, intrarea
# Lakshminarayana wants to change all occurrences of "RESOURCE=". [email protected] [email protected] [email protected] FOX RESOURCE=The quick brown fox # Comment: Originally line 2 said [email protected]
ar fi schimbată în
# Lakshminarayana wants to change all occurrences of "[email protected] [email protected] [email protected] [email protected] FOX [email protected] # Comment: Originally line 2 said [email protected]
Dacă doriți să se potrivească numai atunci când apare RESOURCE=
la începutul unei linii, utilizați ^
:
sed "s/^RESOURCE=.*/[email protected]/"
sau
sed "s/^\(RESOURCE=\).*/\[email protected]/"
Dacă doriți să înlocuiți doar valoarea resursei și nu întregul rest al liniei – de exemplu,
[email protected] [email protected]
la
[email protected] [email protected]
care se poate face și el. Editați-vă întrebarea pentru a spune exact ce doriți, cu explicații complete, clare și exemple.
OK, alegeți unul dintre cele de mai sus s
comenzi. Acum, dacă doriți să editați fișierul în loc (așa cum ați indicat), faceți
sed -i { s command } { yourfile }
Dacă doriți să produceți un fișier nou, faceți
sed { s command } { oldfile } > { newfile }
Nu tastați de fapt {
și }
; sunt acolo doar pentru demarcare.
sed -i
dacă credeți ' face lucrurile corecte și nu