Ask Your Question
0

regulární výraz

asked 2014-11-09 14:50:30 +0100

Gabriel gravatar image

updated 2014-11-09 16:35:30 +0100

Josef Kokeš gravatar image

Ahoj, chtěl jsem si na fray1 vylistovat uživatele příkazem ls /home/stud/ | grep ^s.*g$, ale nedostal jsem úplně očekávající výsledek. Našlo mi to 4 uživatele, ale moje uživatelské jméno tam nebylo, přestože podmínku splňuji. Někdo nějaký nápad, co dělám špatně?

edit retag flag offensive close delete

Comments

Proč ls /home/stud/ to snad ne? Od čeho máme ypcat passwd?

Radomír Polách ( 2014-11-14 17:24:45 +0100 )edit

2 Answers

Sort by » oldest newest most voted
0

answered 2014-11-09 15:45:04 +0100

MiB gravatar image

Ten regulární výraz vybere řádky začínající na „s“ a končící na „g“, tvoje uživatelské jméno ale končí na „b“.

Mimochodem, regulární výrazy je vhodné uzavírat do apostrofů, aby ses vyhnul interpretaci speciálních sekvencí.

edit flag offensive delete publish link more

Comments

Jaj, máš pravdu, spletl jsem si username z jiného serveru *FACEPALM*. Díky

Gabriel ( 2014-11-09 15:47:37 +0100 )edit
0

answered 2014-11-09 16:07:13 +0100

Josef Kokeš gravatar image

updated 2014-11-09 18:20:46 +0100

Pozor na to, že tohle řešení má celou řadu nedostatků. Kromě neošetření znaků regulárního výrazu (kdyby v /home/studaktuálním adresáři byl nějaký adresář (obecně: soubor), jehož jméno začíná ^s. a končí g$, tak to najde právě jen tenhle jeden adresář; kdyby takových bylo víc, tak to vyhodí chybu neexistující soubor) je hlavní ta, že zdaleka ne každý uživatel (i student) musí mít home v /home/stud. Pokud je požadavek na zjištění uživatelů, měl by se použít zdroj, který zaručeně obsahuje jména uživatelů - na frayi tedy ypcat passwd.

edit flag offensive delete publish link more

Comments

Jsi si jisý s tím adresářem? Pro grep je ^ a $ vždycky začátek resp. konec řetězce (řádku). To bych mu musel říct v RE \^ tedy něco jako grep '^\^s.*\$$'. I tak by ale vypsal všechny, které tak začínají resp. končí.

VojtechMyslivec ( 2014-11-09 16:16:09 +0100 )edit

Ano, ale dřív než text ^s.*g$ začne zpracovávat grep jako regulární výraz, tak ho zpracuje shell jako klasickou expanzi názvů souborů a nahradí ho nalezenými vyhovujícími názvy souborů. To se pak stane regulárním výrazem pro grep. Teprve když shell takové názvy nenajde, tak na řádce nechá původní výraz a ten se dostane do grepu.

Josef Kokeš ( 2014-11-09 16:33:21 +0100 )edit

ok, to jo, to jsou ty problémy z ošetřením RE. Zmátlo mě, že jsi psal o /home/stud adresáři. To spíš ale záleží na aktuálním adresáři. V /home/stud může být cokoliv

VojtechMyslivec ( 2014-11-09 16:38:56 +0100 )edit

Pravda. Opravím.

Josef Kokeš ( 2014-11-09 18:19:38 +0100 )edit

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: 2014-11-09 14:50:30 +0100

Seen: 194 times

Last updated: Nov 14 '14