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: Prikazy Bourne Again Shellu [bash]  (Přečteno 5665 krát)

linux_user

  • Návštěvník
  • Příspěvků: 36
Prikazy Bourne Again Shellu [bash]
« kdy: 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.

8472

  • Aktivní člen
  • *
  • Příspěvků: 460
  • Zivot je ako rebrik do kurina, kratky a osraty ...
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #1 kdy: 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
Logic clearly dictates that the needs of the many outweigh the needs of the few.

8472

  • Aktivní člen
  • *
  • Příspěvků: 460
  • Zivot je ako rebrik do kurina, kratky a osraty ...
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #2 kdy: 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.
Logic clearly dictates that the needs of the many outweigh the needs of the few.

linux_user

  • Návštěvník
  • Příspěvků: 36
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #3 kdy: 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 ("/.*".*$

8472

  • Aktivní člen
  • *
  • Příspěvků: 460
  • Zivot je ako rebrik do kurina, kratky a osraty ...
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #4 kdy: 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\"//'
Logic clearly dictates that the needs of the many outweigh the needs of the few.

linux_user

  • Návštěvník
  • Příspěvků: 36
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #5 kdy: 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.

8472

  • Aktivní člen
  • *
  • Příspěvků: 460
  • Zivot je ako rebrik do kurina, kratky a osraty ...
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #6 kdy: 04 Března 2009, 19:11:41 »
takto myslis?
Kód: [Vybrat]
sed 's/\x29.*$//;s/^.*\x28\"//'
Logic clearly dictates that the needs of the many outweigh the needs of the few.

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #7 kdy: 04 Března 2009, 19:43:49 »
Kód: [Vybrat]
awk -F \" '{print $2}' soubor
Kód: [Vybrat]
sed -e 's/^.*(\"//' -e 's/\".*$//'  soubor
« Poslední změna: 04 Března 2009, 19:49:15 od kkaarreell »

Martin Kiklhorn

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Závislák
  • ******
  • Příspěvků: 4807
  • グーグル!ご存知ですか?
    • HEJ
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #8 kdy: 04 Března 2009, 19:47:27 »
cat test | sed "s/\"[^\"]*\$//;s/^[^\"]*\"//"
Jsou ve vašem dotazu OPRAVDU VŠECHNY vám dostupné informace o problému?
Linux user since 2007-10-11, Registered #456007
Virtual
| Distribuce
~/slozka znamená /home/"vase jmeno"/slozka
6521 69DE 0F34 FCBC FB1D  DE76 360E 52B2 F71A B8E8

linux_user

  • Návštěvník
  • Příspěvků: 36
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #9 kdy: 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

DuckD

  • Stálý člen
  • **
  • Příspěvků: 878
  • Open Srdcař
    • www.duckd.cz
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #10 kdy: 04 Března 2009, 20:38:38 »
perl -nle'print /"(.*?)"/' input.txt
8) Lidé žijí v souborech. ===>> LINUXTERO <<=== Pravidelná dávka tvého linuxtera!

linux_user

  • Návštěvník
  • Příspěvků: 36
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #11 kdy: 04 Března 2009, 22:09:14 »
cat test | sed "s/\"[^\"]*\$//;s/^[^\"]*\"//"

tak me napadlo, jestli by jste mi ten vyraz nemohli trocha popsat??

Martin Kiklhorn

  • Člen občanského sdružení Ubuntu ČR a placené komunitní podpory
  • Administrátor fóra
  • Závislák
  • ******
  • Příspěvků: 4807
  • グーグル!ご存知ですか?
    • HEJ
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #12 kdy: 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 - vyhledejte třeba regexp)
« Poslední změna: 05 Března 2009, 00:09:06 od kiklhorn »
Jsou ve vašem dotazu OPRAVDU VŠECHNY vám dostupné informace o problému?
Linux user since 2007-10-11, Registered #456007
Virtual
| Distribuce
~/slozka znamená /home/"vase jmeno"/slozka
6521 69DE 0F34 FCBC FB1D  DE76 360E 52B2 F71A B8E8

linux_user

  • Návštěvník
  • Příspěvků: 36
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #13 kdy: 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?

premet

  • Host
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #14 kdy: 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
« Poslední změna: 09 Března 2009, 23:55:20 od Premet »

premet

  • Host
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #15 kdy: 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}'

linux_user

  • Návštěvník
  • Příspěvků: 36
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #16 kdy: 10 Března 2009, 21:41:47 »
2 Premet:

Jo diky,super!

Yontalcar

  • Stálý člen
  • **
  • Příspěvků: 833
  • Semper fidelis
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #17 kdy: 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
NB: ASUS X53U - AMD Brazos E450; Debian GNU/Linux Sid amd64 (KDE 4.14)
Jen dvě věci jsou nekonečné - vesmír a lidská hloupost. Tím prvním si ovšem nejsem tak jist. - Albert Einstein

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #18 kdy: 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

Yontalcar

  • Stálý člen
  • **
  • Příspěvků: 833
  • Semper fidelis
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #19 kdy: 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ě?
NB: ASUS X53U - AMD Brazos E450; Debian GNU/Linux Sid amd64 (KDE 4.14)
Jen dvě věci jsou nekonečné - vesmír a lidská hloupost. Tím prvním si ovšem nejsem tak jist. - Albert Einstein

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #20 kdy: 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. :-)

nettezzaumana

  • Host
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #21 kdy: 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 ..
« Poslední změna: 12 Března 2009, 12:07:36 od nettezzaumana »

nettezzaumana

  • Host
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #22 kdy: 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[@]}

nettezzaumana

  • Host
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #23 kdy: 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

linux_user

  • Návštěvník
  • Příspěvků: 36
Re: Prikazy Bourne Again Shellu [bash]
« Odpověď #24 kdy: 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.

 

Provoz zaštiťuje spolek OpenAlt.