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
-
Cau,
potreboval bych poradit s nejakym prikazem, ktery me napr z nasledujiciho textu:
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.
-
sed mozes pouzit, akurat som nepochopil co ma byt cielovym vysledkom, coho chces dosiahnut upravou?
potom mozme vymyslat parametre
-
sorry, zle som precital zadanie pri prvej odpovedi.
za predpokladu ze ten obsah bude vypadat ako pises:
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:
sed 's/^.*/\(\"\/.*\".*$/g'
no zrejme to este bude potrebovat nejake doladenie detailov.
-
a nie v inej podobe, tak by som na to isiel asi takto nejako:
sed 's/^.*/\(\"\/.*\".*$/g'
no zrejme to este bude potrebovat nejake doladenie detailov.
ne,tak toto opravdu nefunguje,vypisuje pouze ("/.*".*$
-
no hej, troska som sa unahlil :)
toto by uz malo byt lepsie:
sed 's/\"[ ].*\x29.*$//;s/^.*\x28\"//'
-
no hej, troska som sa unahlil :)
toto by uz malo byt lepsie:
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.
-
takto myslis?
sed 's/\x29.*$//;s/^.*\x28\"//'
-
awk -F \" '{print $2}' soubor
sed -e 's/^.*(\"//' -e 's/\".*$//' soubor
-
cat test | sed "s/\"[^\"]*\$//;s/^[^\"]*\"//"
-
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
-
perl -nle'print /"(.*?)"/' input.txt
-
cat test | sed "s/\"[^\"]*\$//;s/^[^\"]*\"//"
tak me napadlo, jestli by jste mi ten vyraz nemohli trocha popsat??
-
tak me napadlo, jestli by jste mi ten vyraz nemohli trocha popsat??
co se týká sedu tak cat test | sed "s/a/b/"
ve výstupu nahradí písmena "a" za písmena "b"
a nebo cat test | sed "s/a//"
nahradí písmena "a" za "nic"
teď k tomu našemu:
cat test | sed "s/\"[^\"]*\$//;s/^[^\"]*\"//"
klidně by se to dalo napsat jako 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 "/[^"]*"
, zkuste si nad tím test souborem
egrep -o "\"/[^\"]*\"" test
ale 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)
-
Tak bych potreboval dalsi malou pomoc,je to dost podobnej problem,rekneme,ze mam neco jako
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?
-
Taky by to šlo přes awk jako předtím
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
-
Ješte další způsob
echo "neco("neco1", "neco2", "necoN" )" | sed s'/[(,)]/ /g' | gawk '{print $2}'
-
2 Premet:
Jo diky,super!
-
další možnosti:
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
echo "neco("neco1", "neco2", "necoN" )"|sed 's/.*(\([^()]*\))/\1/;s/,\ */\ /g;'|cut -d ' ' -f 1
-
první příkaz v sedu vyřízne oblast v závorkách, druhý odstraní čárky a 3. vybere 1.pole
echo "neco("neco1", "neco2", "necoN" )"|sed 's/.*(\([^()]*\))/\1/;s/,\ */\ /g;'|cut -d ' ' -f 1
tak tohle me dostalo ;D ;D ;D
-
první příkaz v sedu vyřízne oblast v závorkách, druhý odstraní čárky a 3. vybere 1.pole
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ě?
-
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. :-)
-
# 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 ..
-
umh .. got it !!
FOO=(`echo 'foo("bar1", "bar2", "org")' | sed 's/.*(//;s/).*//;s/[,"]//g'`) echo ${FOO[@]}
-
první příkaz v sedu vyřízne oblast v závorkách, druhý odstraní čárky a 3. vybere 1.pole
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:
# 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
echo 'neco("neco1", "neco2", "necoN")' | \
> sed 's/.*(//;\
> s/).*//;\
> s/["\ ]//g;\
> s/,.*//'
neco1
-
Prosil bych dalsi radu, jam mam vymazat mezery mezi
neco (neco) - neco
potrebuju to na
neco(neco) - neco
nebo
neco (neco) - neco
ale to prvni by bylo lepsi.
Dik.
-
...
.. nechtel by sis nahodou precist konecne ten manual ?? nebo treba serial na rootu ??
-
...
.. nechtel by sis nahodou precist konecne ten manual ?? nebo treba serial na rootu ??
Jo ja to dozenu, neboj. Vsak kdyz nechces,nerad ;)
-
Prosil bych dalsi radu, jam mam vymazat mezery mezi
neco (neco) - neco
potrebuju to na
neco(neco) - neco
nebo
neco (neco) - neco
ale to prvni by bylo lepsi.
$ echo 'neco (neco) - neco'|sed 's/\ \+/ /g'
neco (neco) - neco
$ echo 'neco (neco) - neco'|sed 's/\ \+(/(/;s/\ \+/ /g'
neco(neco) - neco
-
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!
-
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.
-
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 .. ;)
nahradí znaky a,2,4 pismenem X
$ 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 ..
-
No jasný, na to autor asi nepomýšlel, ale na mě nekoukej, já jsem to nepsal ;D
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
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.
-
$ 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