Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Grep a bodka.  (Přečteno 2868 krát)

TIBOR

  • Guru
  • *****
  • Příspěvků: 6463
  • Som uzivatel linuxovej distribucie, som linuxak?
    • Zobrazit profil
Grep a bodka.
« kdy: 29 Září 2015, 09:20:03 »
Zdravim.
Riesil som ulohu kde som mal spocitat vsetky bodky v dokumente, ale kedze bodka je specialny znak mal som s tym problem. Nakoniec som vygooglil grep -c [.] . Je aj iny sposob ako grep-u povedat ze bodka ma byt obycajny znak a nie specialny?
Cely prikaz vyzeral
Kód: [Vybrat]
sed 's/ /\n/'g 'Dokument bez názvu' | grep -c [.]
HP Laptop 17-ca1xxx Ubuntu Mate 20.04.2 FF 64bit.
Asus X751LB-TY014H Ubuntu Mate 20.04.1 FF 64bit.
Linus, Lajnas, Línus, Luínus, Lajnus a je mi naozaj jedno, ako ľudia vyslovujú moje meno. Ale "Linux" je vždy "Linux". LINUS TORVALDS, tvorca Linuxového jadra.(V dokumente Revolution OS)

Myrmica

  • Závislák
  • ****
  • Příspěvků: 1701
    • Zobrazit profil
    • MYRMICA
Re:Grep a bodka.
« Odpověď #1 kdy: 29 Září 2015, 09:55:58 »
Normálně regulární výrazy berou bodku jako jakýkoli znak. Pokud chceš aby bala brána jako bodka (tečka :D ) tak ji napiš např takto:
Kód: [Vybrat]
grep "\."Možná ani ty uvozovky tam nemusí být.
Tohle platí pro všechny meta znaky.
Mrkni třeba sem: www.regularnivyrazy.info/regularni-vyrazy-zaklady.html#.VgpDqJcxf7B
Stolní strojek: OS– UBUNTU 16.04 x86_64, MB ASUS P8 Z68-V/GEN3, Intel® Core™ i5-3470 CPU @ 3.20GHz × 4 , 16GiB DDR3, GeForce GTX 670...
Notebook: ASUS U53Jc OS– UBUNTU 16.04 x86_64, Windows 7, Processor – Intel Core i5-460M (2,53 GHz), Graphics – switchable NVIDIA GeForce 310M and Intel GMA HD

ntz_reloaded

  • Lokaj
  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
    • Zobrazit profil
Re:Grep a bodka.
« Odpověď #2 kdy: 29 Září 2015, 10:31:10 »
Kód: [Vybrat]
> cat *.php | perl -pe 's/[^.]//g' | wc -m
307186

^^ treba takto :) ... nicmene docela by me zajimalo, jak to udelat sedem ...  's/[^.]//g' prekvapive v sedu nefunguje jak bych cekal (tedy oznac kazdy znak krome tecky) ..
« Poslední změna: 29 Září 2015, 10:50:52 od ntz_reloaded »
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Myrmica

  • Závislák
  • ****
  • Příspěvků: 1701
    • Zobrazit profil
    • MYRMICA
Re:Grep a bodka.
« Odpověď #3 kdy: 29 Září 2015, 10:46:45 »
Předpokládám, že by to mělo vypadat takto:
Kód: [Vybrat]
's/[^\.]//g'Na všechny metaznaky by měla fungovat ta escape sequence a \. by měl být brán jako jeden znak.
« Poslední změna: 29 Září 2015, 11:18:20 od Myrmica »
Stolní strojek: OS– UBUNTU 16.04 x86_64, MB ASUS P8 Z68-V/GEN3, Intel® Core™ i5-3470 CPU @ 3.20GHz × 4 , 16GiB DDR3, GeForce GTX 670...
Notebook: ASUS U53Jc OS– UBUNTU 16.04 x86_64, Windows 7, Processor – Intel Core i5-460M (2,53 GHz), Graphics – switchable NVIDIA GeForce 310M and Intel GMA HD

ntz_reloaded

  • Lokaj
  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
    • Zobrazit profil
Re:Grep a bodka.
« Odpověď #4 kdy: 29 Září 2015, 10:50:25 »
Předpokládám, že by to mělo vypadat takto:
Kód: [Vybrat]
's/[^\.]//g'Na všechny metaznaky by měla fungovat ta escape sequence a \. b\ měl být brán jako jeden znak.

predpokladat (myslet si) neznamena vedet ;) ... se divim, ze si to nevyzkousis ... tohle bohuzel nefunguje .. a apropos, pokud vim, tak v [] se ne-escapuje
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Myrmica

  • Závislák
  • ****
  • Příspěvků: 1701
    • Zobrazit profil
    • MYRMICA
Re:Grep a bodka.
« Odpověď #5 kdy: 29 Září 2015, 12:02:55 »
No ten výraz mi funguje:
Kód: [Vybrat]
$ echo s/f//g | grep 's/[^\.]//g'
s/f//g
$ echo s/.//g | grep 's/[^\.]//g'
$
Nevím co hledáš, ale na uvedenou řadu znaků to funguje.
Pokud tobě ne, tak používáš špatný linux :D
Stolní strojek: OS– UBUNTU 16.04 x86_64, MB ASUS P8 Z68-V/GEN3, Intel® Core™ i5-3470 CPU @ 3.20GHz × 4 , 16GiB DDR3, GeForce GTX 670...
Notebook: ASUS U53Jc OS– UBUNTU 16.04 x86_64, Windows 7, Processor – Intel Core i5-460M (2,53 GHz), Graphics – switchable NVIDIA GeForce 310M and Intel GMA HD

ntz_reloaded

  • Lokaj
  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
    • Zobrazit profil
Re:Grep a bodka.
« Odpověď #6 kdy: 29 Září 2015, 12:32:02 »
ne, tohle samozrejme nefunguje .... ani v tech tvejch prikladech :D

's/[^.]//g' ma odstranit vsechny znaky a nechat jen tecky a wc -m je spocita :D

Kód: [Vybrat]
$ echo s/f//g | grep 's/[^\.]//g'
s/f//g
$ echo s/.//g | grep 's/[^\.]//g'
$

^^ tady si tusim chtel dat misto grepu sed :D .... ale i tak ti to nebude fungovat (a prekvapive ani s grepem to nefunguje) ... melo by to delat neco takovyhleho (demonstruji na dmesg):

Kód: [Vybrat]
# dmesg | tail -33| perl -pe 's/[^.]//g'
............................................................

ps. ono to v grepu polo-funguje:

Kód: [Vybrat]
# dmesg | tail -33| sed 's/[^.]//g'
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..

^^ akorat to neodstranuje \n a mozna neco jineho, takze to je nepouzitelne
« Poslední změna: 29 Září 2015, 12:35:15 od ntz_reloaded »
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Martin Šácha

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Guru
  • ******
  • Příspěvků: 5153
    • Zobrazit profil
Re:Grep a bodka.
« Odpověď #7 kdy: 29 Září 2015, 13:40:36 »
Kód: [Vybrat]
dmesg | tail -33| sed 's/[^.]//g' | tr -d [:cntrl:] | grep '\.'
"tr" zlikviduje bordel
"grep" na konci vygeneruje prompt na novem radku
« Poslední změna: 29 Září 2015, 13:47:44 od Martin Šácha »
Mint MATE 64bit / DuckDuckGo.com
Programátoři považují WYSIWYG za špatné u kódu i u žen. Programátor chce "dostat to, co žádá“ – kód tajemný, neodpouštějící, nebezpečný.

ntz_reloaded

  • Lokaj
  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
    • Zobrazit profil
Re:Grep a bodka.
« Odpověď #8 kdy: 29 Září 2015, 13:47:19 »
Kód: [Vybrat]
> dmesg | tail -33| sed 's/[^.]//g' | tr -d '\n' | wc -m
60

> dmesg | tail -33| sed 's/[^.]//g' | tr -d '\n' | grep '\.' | wc -m
61

> dmesg | tail -33 | perl -pe 's/[^.]//g' | wc -m
60

^^ tady porad nekomu neco nedochazi :) ... novej radek je taky znak, pokud mas spocitat pocet tecek v inputu a beres to takto znakove, tak tam ten novej radek asi spis nechces
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Martin Šácha

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Guru
  • ******
  • Příspěvků: 5153
    • Zobrazit profil
Re:Grep a bodka.
« Odpověď #9 kdy: 29 Září 2015, 13:51:24 »
Takze opet zdrava vyziva reprezentovana grepem zcela k nicemu  :D
Mint MATE 64bit / DuckDuckGo.com
Programátoři považují WYSIWYG za špatné u kódu i u žen. Programátor chce "dostat to, co žádá“ – kód tajemný, neodpouštějící, nebezpečný.

ntz_reloaded

  • Lokaj
  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
    • Zobrazit profil
Re:Grep a bodka.
« Odpověď #10 kdy: 29 Září 2015, 14:02:10 »
Takze opet zdrava vyziva reprezentovana grepem zcela k nicemu  :D
abych se priznal, tak me samotneho docela dost prekvapilo, ze ten sed nema nejakej "mod" aby ten soubor cetl celej a ne line by line .... ja osobne sed nepouzivam dlouhy roky .. driv jsem ho pouzival, ale stvalo me, ze ta implementace je vsude jina (linux, solaris, aix) a 100% jsem se preorientoval na perl
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Myrmica

  • Závislák
  • ****
  • Příspěvků: 1701
    • Zobrazit profil
    • MYRMICA
Re:Grep a bodka.
« Odpověď #11 kdy: 29 Září 2015, 14:31:55 »
Takže jsem to udělal trochu podle toho co chtěl ntz_reloaded, ale v sedu si nejsem (na rozdíl od regulárních výrazů) úplně jistý.  Zvláště když se sed tváří že je podporuje a není to zcela pravda.
Kód: [Vybrat]
dmesg | tail -33| sed -r 's/[^.]//g' | sed -e :a -e '$!N; s/\n//; ta'Prostě jsem řešil klasický regulární výraz a ne celý sedovský výraz. Sypu si popel na hlavu :D.
Určitě by to šlo dostat to do jednoho příkazu, ale to teď nejsem schopen napsat :D.
Stolní strojek: OS– UBUNTU 16.04 x86_64, MB ASUS P8 Z68-V/GEN3, Intel® Core™ i5-3470 CPU @ 3.20GHz × 4 , 16GiB DDR3, GeForce GTX 670...
Notebook: ASUS U53Jc OS– UBUNTU 16.04 x86_64, Windows 7, Processor – Intel Core i5-460M (2,53 GHz), Graphics – switchable NVIDIA GeForce 310M and Intel GMA HD

TIBOR

  • Guru
  • *****
  • Příspěvků: 6463
  • Som uzivatel linuxovej distribucie, som linuxak?
    • Zobrazit profil
Re:Grep a bodka.
« Odpověď #12 kdy: 29 Září 2015, 21:21:09 »
Uff, na par bodiek ste sa pekne rozbehli. :D Vdaka vsetkym za inspiracie.
« Poslední změna: 29 Září 2015, 21:26:14 od TIBOR »
HP Laptop 17-ca1xxx Ubuntu Mate 20.04.2 FF 64bit.
Asus X751LB-TY014H Ubuntu Mate 20.04.1 FF 64bit.
Linus, Lajnas, Línus, Luínus, Lajnus a je mi naozaj jedno, ako ľudia vyslovujú moje meno. Ale "Linux" je vždy "Linux". LINUS TORVALDS, tvorca Linuxového jadra.(V dokumente Revolution OS)

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Grep a bodka.
« Odpověď #13 kdy: 30 Září 2015, 01:19:30 »
Nedalo mi to, abych to nezkusil vyřešit přes buffer.  Dokonce je ten sed  POSIX způsobilý:
Kód: [Vybrat]
dmesg | tail -33| echo -n $(sed -n 'H;${x;s/[^.]//gp}') | wc -msed ale asi výstup tisknout rovnou bez koncového newline neumí..

ještě awk:
Kód: [Vybrat]
dmesg | tail -33| awk '{gsub(/[^.]/,"");printf $0}' | wc -m
Ale ten Perl je tu víc než dvakrát rychlejší, než awk, i sed.

Mimochodem:
... nicmene docela by me zajimalo, jak to udelat sedem ...  's/[^.]//g' prekvapive v sedu nefunguje jak bych cekal (tedy oznac kazdy znak krome tecky) ..
Tohle naopak funguje přesně podle očekávání, vzhledem k tomu, že sed je řádkový procesor, fungující tudíž ve smyčce typu while read line; do ...; done ;)

Edit: A řádově rychlejší je pak trdelník:
Kód: [Vybrat]
dmesg | tail -33| tr -cd . | wc -m
« Poslední změna: 30 Září 2015, 09:46:27 od GdH »

 


Provoz zaštiťuje spolek OpenAlt.