Puncte:1

Aplicați operațiuni sed numai la liniile care încep cu un anumit șir

drapel bd

Am următorul format de fișier

Primit de la +11231231234 la 2021-10-10T19:56:50-07:00:
Acesta este un mesaj care conține cuvinte precum de la, la etc.

Trimis la +11231231234 la 2021-10-11T06:50:57+00:00:
Acesta este un alt mesaj care conține cuvinte precum to, at etc.

Vreau să curăț liniile „Received” și „Sent”, următoarele comenzi sed realizează acest lucru

fisier pisica | sed 's/din//g' | sed 's/to/ /g' | sed 's/+\w\+//' | \ 
sed 's/at//g' | sed 's/T/ /g' | sed 's/[[:digit:].]*\:$//' | \ 
sed 's/[[:digit:].]*\:$//' | sed 's/-$//' | sed 's/-$//' | sed 's/+$//'

și rezultă în cele ce urmează

Primit 2021-10-10 19:56:50
Acesta este un mesaj care conține cuvinte precum , etc.

Trimis 2021-10-11 06:50:57
Acesta este un alt mesaj care conține cuvinte precum , etc.

După cum puteți vedea, curăță bine liniile „Primit” și „Trimis”. Dar curăță și liniile de mesaje! Cum pot aplica aceste operațiuni numai pe liniile care încep cu „Received” și „Sent”?

drapel tm
Postat încrucișat în [Unix și Linux](https://unix.stackexchange.com/q/679965/13792)
Puncte:2
drapel in

Puteți folosi un model pentru a alege liniile cărora să le aplicați o comandă ulterioară:

sed '/^Sent\|^Received/ s/pattern/replacement/' your_file

Primă

De fapt, puteți face toate editările dvs. într-o singură comandă glorioasă sed:

sed '/^Primit\|^Trimis/ s/\(^[^ ]*\).*la \(.*\)T\(.*\)[-+].*/\1 \2 \3 /' fișierul_dvs

În esență, modelul se potrivește cu fiecare bucată de text de pe linie și noi doar „Amintiți-vă” toate biții pe care vrem să le păstrăm și apoi înlocuiți întreaga linie cu lor.

Ieșire:

Primit 2021-10-10 19:56:50
Acesta este un mesaj care conține cuvinte precum de la, la etc.

Trimis 2021-10-11 06:50:57
Acesta este un alt mesaj care conține cuvinte precum to, at etc.

Modul în care funcționează este următorul:

  • \( și \) sunt „grupuri de captură” care își amintesc orice a fost potrivit între ele.
  • ^[^ ]* se potrivește cu începutul unei linii urmată de orice număr de caractere consecutive fără spații albe (adică primul cuvânt de pe linie).
  • .*la potrivește totul până la și inclusiv cuvântul „la” (și spațiul urmând-o) - aceasta nu este într-un grup de captură și deci nu este „rememorat”.
  • \(.*\)T își amintește (în al doilea grup de captură) totul până la, dar nu inclusiv „T” majuscul.
  • \(.*\)[-+].* își amintește (în al treilea grup de captură) totul până la, dar fără a include nici un „-” sau un „+” (și orice urmează după „-/+”).
  • /\1 \2 \3/ înseamnă înlocuirea potrivirii (adică întreaga linie) cu conținutul grupelor 1, 2 și 3 de captură.

Această pagină explică sed foarte bine - de asemenea, are un set fantastic de alte unix tutoriale.

jf4i2d avatar
drapel bd
multumesc omule sexy

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.