Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: linux_user 04 Března 2009, 16:42:17

Název: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 04 Března 2009, 16:42:17
Cau,
potreboval bych poradit s nejakym prikazem, ktery me napr z nasledujiciho textu:

Kód: [Vybrat]
cau("/asdfdas/asdas/dad/adas" JDHsdaJD) = n
gdfu("/adas/asdas/da" JsadDHJD) = n
au("/asdfdas/ass/dad/adas" JDdasD) = n
fgs("/asdfdas/asdas" JsdaDdsa) = n
c("/aadas/dad/adas" Jasd) = n

vybral pouze casti rekneme s cestou(resp: /neco/neco/neco az po ", vlstne tu cast od " po " ). Mzslim, ze bz to melo jit pomoci utility sed nebo awk,ale nejak mi to porad nejde.
Dik.
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: 8472 04 Března 2009, 16:55:31
sed mozes pouzit, akurat som nepochopil co ma byt cielovym vysledkom, coho chces dosiahnut upravou?
potom mozme vymyslat parametre
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: 8472 04 Března 2009, 17:05:32
sorry, zle som precital zadanie pri prvej odpovedi.
za predpokladu ze ten obsah bude vypadat ako pises:
Kód: [Vybrat]
cau("/asdfdas/asdas/dad/adas" JDHsdaJD) = n
gdfu("/adas/asdas/da" JsadDHJD) = n
au("/asdfdas/ass/dad/adas" JDdasD) = n
fgs("/asdfdas/asdas" JsdaDdsa) = n
c("/aadas/dad/adas" Jasd) = n

a nie v inej podobe, tak by som na to isiel asi takto nejako:
Kód: [Vybrat]
sed 's/^.*/\(\"\/.*\".*$/g'no zrejme to este bude potrebovat nejake doladenie detailov.
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 04 Března 2009, 17:42:31
a nie v inej podobe, tak by som na to isiel asi takto nejako:
Kód: [Vybrat]
sed 's/^.*/\(\"\/.*\".*$/g'no zrejme to este bude potrebovat nejake doladenie detailov.

ne,tak toto opravdu nefunguje,vypisuje pouze ("/.*".*$
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: 8472 04 Března 2009, 18:40:02
no hej, troska som sa unahlil :)
toto by uz malo byt lepsie:
Kód: [Vybrat]
sed 's/\"[ ].*\x29.*$//;s/^.*\x28\"//'
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 04 Března 2009, 19:05:11
no hej, troska som sa unahlil :)
toto by uz malo byt lepsie:
Kód: [Vybrat]
sed 's/\"[ ].*\x29.*$//;s/^.*\x28\"//'

JJ,je,ale ne uplne,zacina to spravne,ale konci to az na konci :) Jinak ta cesta muze byt promene delky,ale to je asi jasny.
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: 8472 04 Března 2009, 19:11:41
takto myslis?
Kód: [Vybrat]
sed 's/\x29.*$//;s/^.*\x28\"//'
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: kkaarreell 04 Března 2009, 19:43:49
Kód: [Vybrat]
awk -F \" '{print $2}' soubor
Kód: [Vybrat]
sed -e 's/^.*(\"//' -e 's/\".*$//'  soubor
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: Martin Kiklhorn 04 Března 2009, 19:47:27
cat test | sed "s/\"[^\"]*\$//;s/^[^\"]*\"//"
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 04 Března 2009, 19:57:51
Ano, tak to vypada,ze uz to slape tak jak ma. Jinak to tu pls jeste nechte odemkly, urcite sem jeste neco v blizke dobe dam.THX
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: DuckD 04 Března 2009, 20:38:38
perl -nle'print /"(.*?)"/' input.txt
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 04 Března 2009, 22:09:14
cat test | sed "s/\"[^\"]*\$//;s/^[^\"]*\"//"

tak me napadlo, jestli by jste mi ten vyraz nemohli trocha popsat??
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: Martin Kiklhorn 05 Března 2009, 00:01:32
tak me napadlo, jestli by jste mi ten vyraz nemohli trocha popsat??
co se týká sedu tak
Kód: [Vybrat]
cat test | sed "s/a/b/" ve výstupu nahradí písmena "a" za písmena "b"
a nebo
Kód: [Vybrat]
cat test | sed "s/a//" nahradí písmena "a" za "nic"

teď k tomu našemu:
Kód: [Vybrat]
cat test | sed "s/\"[^\"]*\$//;s/^[^\"]*\"//"
klidně by se to dalo napsat jako
Kód: [Vybrat]
cat test | sed "s/\"[^\"]*\$//" | sed "s/^[^\"]*\"//"dělá dvě věci
1) nahrazuje konec řetězce za "nic" - s/\"[^\"]*\$//
2) nahrazuje začátek řetězce za "nic" - s/^[^\"]*\"//

trochu to vyčistím -
pro sed je tam vlastně s/conahrazuji/zaconahrazuji - zajímá nás část conahrazuji, tedy
1)
\"[^\"]*\$ - to je jenom pro sed oescapované:
"[^"]*$ - tedy najdu sekvenci začínající " pokračující libovolným počtem * předcházejícího výrazu, tedy čehokoliv jiného než uvozovek [^"] na konci řádku $ a to nahradím ničím // (ale to už je část která patří sed)
Zkrátka odstraním od posledních uvozovek (včetně) všechno do konce řádku

2)
^[^\"]*\" - to je jenom pro sed oescapované:
^[^"]*" - tedy od začátku řádku ^ opět najdu sekvenci obsahující libovolný počet neuvozovek [^"]* končící uvozovkou " a nahradím to ničím //

Kdybych chtěl jenom matchnout řetězec začínající uvozovkami a lomítkem a končící uvozovkami tak bych použil regexp
Kód: [Vybrat]
"/[^"]*", zkuste si nad tím test souborem
Kód: [Vybrat]
egrep -o "\"/[^\"]*\"" testale chtěl jste to v sedu.

jinak tady na fóru v tipy, triky napsal nettezzaumana pár hezkých příkladů. (a další užitečný zdroj je dokumentace k AIX od IBM na jejich webu (http://www.ibm.com/developerworks/views/aix/libraryview.jsp) - vyhledejte třeba regexp)
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 09 Března 2009, 23:18:52
Tak bych potreboval dalsi malou pomoc,je to dost podobnej problem,rekneme,ze mam neco jako

Kód: [Vybrat]
neco("neco1", "neco2", "necoN" )

A potrebuju nejak vybrat to neco 1,ale tech "neco" tam muze byt vic,takze nemuzu postupovat odzadu k prvni " jako  vpredchozim pripade...Napadlo me pomoci cut,ale nevim,jak zadat jako oddelovac " a pak dat 1 cast??
Pomuze nekdo?
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: premet 09 Března 2009, 23:26:48
Taky by to šlo přes awk jako předtím
Kód: [Vybrat]
gawk -F\"  '{print $2}' soubor
to vytiskne to neco1, když dáš $3 tak už to bude , pak zase další bude neco2 atd. prostě oddělovat jsou uvozovky
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: premet 10 Března 2009, 08:42:49
Ješte další způsob
Kód: [Vybrat]
echo "neco("neco1", "neco2", "necoN" )" | sed s'/[(,)]/ /g' | gawk '{print $2}'
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 10 Března 2009, 21:41:47
2 Premet:

Jo diky,super!
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: Yontalcar 11 Března 2009, 16:29:28
další možnosti:
Kód: [Vybrat]
echo "neco("neco1", "neco2", "necoN" )"|sed 's/.*(\([^()]*\))/\1/;s/,\ */\ /g;s/\([^ ]*\)\ .*/\1/'
první příkaz v sedu vyřízne oblast v závorkách, druhý odstraní čárky a 3. vybere 1.pole
Kód: [Vybrat]
echo "neco("neco1", "neco2", "necoN" )"|sed 's/.*(\([^()]*\))/\1/;s/,\ */\ /g;'|cut -d ' ' -f 1
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: kkaarreell 11 Března 2009, 18:01:47
první příkaz v sedu vyřízne oblast v závorkách, druhý odstraní čárky a 3. vybere 1.pole
Kód: [Vybrat]
echo "neco("neco1", "neco2", "necoN" )"|sed 's/.*(\([^()]*\))/\1/;s/,\ */\ /g;'|cut -d ' ' -f 1
tak tohle me dostalo  ;D  ;D  ;D
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: Yontalcar 12 Března 2009, 06:52:12
první příkaz v sedu vyřízne oblast v závorkách, druhý odstraní čárky a 3. vybere 1.pole
Kód: [Vybrat]
echo "neco("neco1", "neco2", "necoN" )"|sed 's/.*(\([^()]*\))/\1/;s/,\ */\ /g;'|cut -d ' ' -f 1
tak tohle me dostalo  ;D  ;D  ;D
co? je tam něco blbě?
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: kkaarreell 12 Března 2009, 10:40:53
co? je tam něco blbě?
ale ne, jen me prislo vtipny, jak to prohanis pres dve roury, abys to nakonec predhodit "cutu", kterej to mohl udelat rovnou. :-)
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: nettezzaumana 12 Března 2009, 11:44:25
Kód: [Vybrat]
# echo 'foo("bar1", "bar2", "org")' | \
> perl -e '$_ = <>; s/.*(\(.*\)).*/$1/; eval("\@FOO = $_"); print "$_\n" foreach @FOO'
bar1
bar2
org

.. karliku, ne aby ses mi ty lisaku stara vysmal :D .. ukaz mi schvalne, jak udelat z hodnot mezi () pole a vracet prvky indexovane ..

nevedel jsem jak na to v sedu a ani v bashi, tak jsem to sprasil resenim vyse ..
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: nettezzaumana 12 Března 2009, 11:55:06
umh .. got it !!
Kód: [Vybrat]
FOO=(`echo 'foo("bar1", "bar2", "org")' | sed 's/.*(//;s/).*//;s/[,"]//g'`) echo ${FOO[@]}
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: nettezzaumana 12 Března 2009, 12:06:25
první příkaz v sedu vyřízne oblast v závorkách, druhý odstraní čárky a 3. vybere 1.pole
Kód: [Vybrat]
echo "neco("neco1", "neco2", "necoN" )"|sed 's/.*(\([^()]*\))/\1/;s/,\ */\ /g;'|cut -d ' ' -f 1
tak tohle me dostalo  ;D  ;D  ;D
co? je tam něco blbě?
.. je to zbytecne slozite a neefektivni ..

.. ad.1) nefunguje to ani jak myslis:
Kód: [Vybrat]
# echo "neco("neco1", "neco2", "necoN")"
neco(neco1, neco2, necoN)
# echo 'neco("neco1", "neco2", "necoN")' ## musis takhle kdyz uz neco
neco("neco1", "neco2", "necoN")

jinak elegantni je zde pro tisknuti prvniho nebo posledniho prvku tohle
Kód: [Vybrat]
echo 'neco("neco1", "neco2", "necoN")' | \
> sed 's/.*(//;\
> s/).*//;\
> s/["\ ]//g;\
> s/,.*//'
neco1
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 16 Března 2009, 21:27:00
Prosil bych dalsi radu, jam mam vymazat mezery mezi
Kód: [Vybrat]
neco            (neco)  - necopotrebuju to na
Kód: [Vybrat]
neco(neco) - neco
nebo
Kód: [Vybrat]
neco (neco) - necoale to prvni by bylo lepsi.

Dik.
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: nettezzaumana 16 Března 2009, 21:31:40
...
.. nechtel by sis nahodou precist konecne ten manual ?? nebo treba serial na rootu ??
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 16 Března 2009, 21:48:16
...
.. nechtel by sis nahodou precist konecne ten manual ?? nebo treba serial na rootu ??

Jo ja to dozenu, neboj. Vsak kdyz nechces,nerad ;)
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: Yontalcar 16 Března 2009, 21:58:39
Prosil bych dalsi radu, jam mam vymazat mezery mezi
Kód: [Vybrat]
neco            (neco)  - necopotrebuju to na
Kód: [Vybrat]
neco(neco) - neco
nebo
Kód: [Vybrat]
neco (neco) - necoale to prvni by bylo lepsi.
Kód: [Vybrat]
$ echo 'neco            (neco)  - neco'|sed 's/\ \+/ /g'
neco (neco) - neco

$ echo 'neco            (neco)  - neco'|sed 's/\ \+(/(/;s/\ \+/ /g'
neco(neco) - neco
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: linux_user 16 Března 2009, 22:10:41
Diky Yontalcar, uz jsem na to taky tak nejak prisel, prvne sem nahradil dve za 1 a pak vetsi pocet za nic..ale kazdopadne dik!
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: premet 16 Března 2009, 23:25:24
Doporučím ti pěkný článek → http://www.owebu.cz/linux/vypis.php?clanek=914 (http://www.owebu.cz/linux/vypis.php?clanek=914), jsou tam toho 3 stránky, věřím, že ti to hodně pomůže.
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: nettezzaumana 16 Března 2009, 23:49:47
Doporučím ti pěkný článek → http://www.owebu.cz/linux/vypis.php?clanek=914 (http://www.owebu.cz/linux/vypis.php?clanek=914), jsou tam toho 3 stránky, věřím, že ti to hodně pomůže.
OLOL .. nechci prudit, ale obsahuje dost zasadni chyby .. ;)

Citace: xx
nahradí znaky a,2,4 pismenem X
 
Kód: [Vybrat]
$ echo "11 stare 22 stare 33 stare" | sed 's/[a,2,4]/X/g'
11 stXre XX stXre 33 stXre

.. tohle je samozrejme spatne .. protoze co to asi udela s "," ;)

# echo "11 stare, 22 stare, 33 stare" | sed 's/[a,2,4]/X/g'
11 stXreX XX stXreX 33 stXre

.. chyb je tam vic ..
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: premet 17 Března 2009, 08:26:24
No jasný, na to autor asi nepomýšlel, ale na mě nekoukej, já jsem to nepsal  ;D
Kód: [Vybrat]
echo "11 stare, 22 stare, 33 stare" | sed 's/[a24]/X/g'
11 stXre, XX stXre, 33 stXre
zajímalo by mě jak teda v sedu funguje, že nejsou přípustný jen znaky, ale celý řetězec jako třeba, kdybych měl 2 slova
Kód: [Vybrat]
echo "11 stare, 22 stare, 33 stare, s, a, nove, nove" | sed 's/[stare,nove]/X/g'jako vím, že takhle to nejde, protože bere každej znak z té hranaté závorky a né jako celá slova.
Název: Re: Prikazy Bourne Again Shellu [bash]
Přispěvatel: nettezzaumana 17 Března 2009, 09:04:13
Kód: [Vybrat]
$ echo -e 'foobar\nbooblah\nmoopab' | sed 's/\(foo\|boo\|moo\)/x/'
xbar
xblah
xpab

$ # echo -e 'foobar\nbooblah\nmoopab' | sed 's/[fbm]oo/x/'
xbar
xblah
xpab