Puncte:0

Cum se adaugă la sfârșitul unei linii înainte de prima potrivire a modelului?

drapel in

Am un fișier care conține câteva date aleatorii precum:

numărul1 numărul2 numărul3
&SFÂRŞIT

Vreau să adaug un \ la sfârșitul liniei care conține numărul 3, dar nu pot potrivi un model pe acea linie, deoarece numărul se schimbă în continuare. Așa că încerc să potrivesc „&END” în sed și apoi să adaug o linie înainte, dar asta nu funcționează pentru mine, deoarece creează o linie nouă, cum ar fi

numărul1 numărul2 numărul3

\

&SFÂRŞIT

Ieșirea mea dorită este

număr1 număr2 număr3 \
&SFÂRŞIT

De asemenea, trebuie să fac această modificare doar la prima apariție a &END în fișier. Există vreo modalitate de a face acest lucru folosind sed, sau poate awk?

EDITARE: Fișierul meu de intrare este test.restart, care arată astfel:

&COORD

1.4089452021105357E+01 1.3165670625576730E+01 1.2727066323166799E+01 \
 ...

 ...

1.3549295360587577E+01 1.2120902691780184E+01 1.2741652733169291E+01

&SFÂRŞIT
...
...
&COORD

H 3475843 73457834 7346587435
...
...
&SFÂRŞIT

Trebuie doar să fac modificările în blocul de text înainte de prima apariție a &END.

pLumo avatar
drapel in
Trebuie să adăugați câteva exemple din lumea reală pentru a vă face întrebarea rezolvabilă.
Pauling0304 avatar
drapel in
@pLumo Exemple din lumea reală despre ce? Soluțiile mele încercate care nu funcționează?
pLumo avatar
drapel in
Mă refer la datele de intrare. ("*sfârșitul liniei care conține numărul 3, dar nu pot potrivi un model pe acea linie, deoarece numărul se schimbă în continuare.*"). Care este atunci „*numărul3*” din lumea reală? Sau mai bine: de unde știi că aceasta este linia pe care vrei să o potriviți?
pLumo avatar
drapel in
Un alt indiciu: folosiți stilul „cod” în loc de stilul „citat” ar face întrebarea mai ușor de citit. Vă puteți edita întrebarea.
pLumo avatar
drapel in
okkk... exemplul tău din lumea reală este foarte diferit de exemplul tău simplificat. \ nu ar trebui să apară la sfârșitul rândului înainte de `&END`... Va fi în rândul următor după `&COORD`?
Pauling0304 avatar
drapel in
@pLumo Nu, că \ la sfârșitul rândului după &COORD este deja prezent. Acum vreau să-l pun la sfârșitul rândului înainte de &END.
pLumo avatar
drapel in
ah bine, atunci raspunsul meu este valabil.
Puncte:1
drapel in

Poți să folosești sed -z și includ \n în modelul tău:

-z, --null-data
linii separate prin caractere NUL

sed -Ez 's/(\n+&END)/ \1/'

sed în mod implicit înlocuiește doar prima apariție pe linie. Deoarece ai o singură linie dacă folosești delimitator NUL, ești bine.

-E spune sed pentru a utiliza Extended Regex (ERE) în loc de Basic Regex (BRE). Puteți omite steagul, dar apoi trebuie să scăpați de bretele:

sed -z 's/\(\n+&END\)/ \1/'

Ieșire:

&COORD

1.4089452021105357E+01 1.3165670625576730E+01 1.2727066323166799E+01 \
 ...

 ...

1.3549295360587577E+01 1.2120902691780184E+01 1.2741652733169291E+01 \

&SFÂRŞIT
...
...
&COORD

H 3475843 73457834 7346587435
...
...
&SFÂRŞIT

Notă, -z este bine în Ubuntu, dar nu este disponibil în toate sed implementări și, prin urmare, nu o soluție portabilă.

Pauling0304 avatar
drapel in
Îmi puteți spune pentru ce este steagul -E? Și pot folosi -i cu el, pentru că vreau să editez asta în același fișier?
pLumo avatar
drapel in
Da, puteți folosi `-i` dacă sunteți bine cu rezultatul. S-a adăugat explicația pentru „-E”.
Pauling0304 avatar
drapel in
primesc eroarea: sed: -e expresia #1, caracterul 19: referință nevalidă \1 pe comanda „s” RHS
pLumo avatar
drapel in
sigur, folosești aceeași comandă?
Pauling0304 avatar
drapel in
Da, chiar am copy pasted
pLumo avatar
drapel in
Ambele merg bine pentru mine. care versiune de Ubuntu? Primesc această eroare când folosesc prima versiune fără „-E”, care este de așteptat
Pauling0304 avatar
drapel in
Ubuntu 20.04.3 LTS
pLumo avatar
drapel in
Aceeași versiune aici. Ar trebui să funcționeze bine, nu mai pot spune, îmi pare rău.
Pauling0304 avatar
drapel in
Am încercat cealaltă opțiune fără indicatorul -E și asta nu dă nicio eroare, dar nici nu face treaba.
pLumo avatar
drapel in
Bună idee @bac0n.

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.