Puncte:0

Cum să salvați anumite linii de ieșiri ale liniei de comandă

drapel cn

Am un executabil care produce următoarele pentru terminal:

---Start---
Un text
Mai mult text
-1.
1.
0,39
10
-199
mai mult text
   Complet
---Sfârşit---

Vreau să scriu doar valorile numerice din terminal într-un fișier. Chiar acum, folosesc

./executable 2>&1 | grep -vE 'S|M|s|^[--]|^[ ]' | tee log.txt

Asta pare să facă ceea ce vreau. Mai exact, folosind -v, declar în mod explicit ce să exclud. Cu toate acestea, acest lucru pare destul de ineficient, deoarece ar trebui să adaug întregul alfabet (atât litere mari, cât și litere mici) pentru a mă asigura că numai valorile numerice sunt adăugate în fișierul log.txt.

Există mai bine să scrieți toate valorile numerice (pozitive și negative) într-un fișier?

drapel in
Ești în căutarea unui nou regex? „^[0-9-].*$” va capta linii întregi începând cu o cifră sau un semn minus. Sau utilizați \d pentru cifre, consultați de exemplu [regular-expressions.info](https://www.regular-expressions.info/quickstart.html).
drapel hr
Vezi, de exemplu, [grep - Permite numai expresia regex în virgulă mobilă](https://unix.stackexchange.com/questions/397784/only-allow-floating-points-regex) și [Potrivirea numerelor în virgulă mobilă cu o expresie regulată](https ://www.regular-expressions.info/floatingpoint.html)
bac0n avatar
drapel cn
@pbhj punctul ar trebui mutat în clasa de caractere `'^[0-9.-]*$'`, dar așa cum a subliniat @steeldrive, s-ar putea să nu fie suficient.
waltinator avatar
drapel it
Dacă nu se află la începutul expresiei, „`-`” este confundat cu operatorul „interval” („[0-9]`”). Folosiți „`^[-.0-9]+`”. De asemenea, puteți utiliza opțiunea „`-o`” a lui `grep` pentru a afișa numai șirul potrivit.
bac0n avatar
drapel cn
@waltinator care se va potrivi și cu Start și End...
drapel in
@bac0n, niciunul dintre numere nu începe cu un punct zecimal, regex-ul meu era să găsesc linii care încep cu o cifră sau „-”, restul liniei poate fi orice caracter. Dacă puneți punctul în interiorul selectorului de interval, va trebui să-l scăpați deoarece „." înseamnă „orice caracter o dată”, de asemenea, ar putea fi necesar pentru a scăpa de „-” (adică „\-”), dar dacă nu este între alte două caractere, am găsit că motorul regex îl recunoaște întotdeauna ca un caracter separat. Depinde de versiunea grep (sau alt program); al meu funcționează pentru intrarea dată în GNU Grep 3.6; testat pe Kali.
bac0n avatar
drapel cn
@pbhj mai întâi, modelul se va potrivi și cu etichetele de început și de sfârșit. Apoi, un punct din parantezele `[.]` este interpretat literal (nu este nevoie să scape). Dacă o cratimă este plasată prima sau ultima în clasa interval, aceasta va fi de asemenea interpretată literal.
drapel in
S-ar putea să aveți dreptate la punctul literal, nu este ceva cu care am experiență, dar cratima care nu necesită evadare funcționează cu siguranță, așa cum am spus, testată pe GNU Grep. Se potrivește la început pentru că el caută linii cu o cifră la început, se potrivește la sfârșit pentru că eșantionul arată că dorește toate liniile care au o cifră (sau minus). Incearca-l.
bac0n avatar
drapel cn
`echo '---End---' | grep '^[0-9-].*$'`
Puncte:1
drapel cn

Trebuie pur și simplu să excludeți liniile care au text în ele. Utilizați acest grep în comandă:

grep -v „[A-Za-z]”

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.