Regulární výraz v sed nefunguje

Regulární výraz v sed nefunguje
« kdy: 15. 01. 2013, 11:21:11 »
Ahoj.

Potřeboval bych pomoct s regulárním výrazem pro sed. Nějak nechápu, proč mi to nefunguje :) Mým cílem je vypsat všechny definované proměnné, jejichž název obsahuje jen malá písmena, číslice a podtržítko. Zkouším to takto:

declare -p | sed -ne 's/^declare -- \([a-z0-9_]+\)=/\1/p'

K mému údivu se vypíší i proměnné jako PATH, BASH a podobně, tedy proměnné s velkými písmeny :( Kde je chyba?
Zkoušel jsem třeba i:

declare -p | sed -ne '/declare -- [a-z]/p'

s podobným stejnám výsledkem :(
« Poslední změna: 15. 01. 2013, 12:42:25 od Petr Krčmář »


trom

Re:sed REGEX
« Odpověď #1 kdy: 15. 01. 2013, 12:22:54 »
Kód: [Vybrat]
declare -p |cut -f3 -d" "|cut -f1 -d "=" |grep '[a-z]\+'
tohle mi funguje

Re:sed REGEX
« Odpověď #2 kdy: 15. 01. 2013, 12:27:41 »
Citace
     -n      By default, each line of input is echoed to the standard output after all of the commands have been applied to it.  The -n option
             suppresses this behavior.
man sed(1)

Kód: [Vybrat]
# echo X | sed 's/X/Y/'
Y
# echo X | sed -n 's/X/Y/'
#

Re:sed REGEX
« Odpověď #3 kdy: 15. 01. 2013, 12:31:25 »
Citace
     -n      By default, each line of input is echoed to the standard output after all of the commands have been applied to it.  The -n option
             suppresses this behavior.
man sed(1)

Kód: [Vybrat]
# echo X | sed 's/X/Y/'
Y
# echo X | sed -n 's/X/Y/'
#

Ale vždyť -n používám správně. Problém je s regexem.. :/

Re:sed REGEX
« Odpověď #4 kdy: 15. 01. 2013, 12:40:59 »
Tak vypadá to, že můj sed nějak zvláštně ignoruje velikost písmen a přitom:
declare -p | sed -ne '/^declare -- [M-P]/p'
vypíše jiný výsledek než
declare -p | sed -ne '/^declare -- [m-p]/p'
ale ten druhý kombinuje veklá i malá písmena O__O. Asi přestanu používat Gentoo :/


Re:Regulární výraz v sed nefunguje
« Odpověď #5 kdy: 15. 01. 2013, 12:44:32 »
Na Ubuntu to funguje :) Achjo..

Re:sed REGEX
« Odpověď #6 kdy: 15. 01. 2013, 12:54:48 »
Ale vždyť -n používám správně. Problém je s regexem.. :/
Omlouvam se, prehlidl jsem to p na konci... s/ je zbytecny, staci pouzit /.../p

Tak vypadá to, že můj sed nějak zvláštně ignoruje velikost písmen a přitom:
declare -p | sed -ne '/^declare -- [M-P]/p'
vypíše jiný výsledek než
declare -p | sed -ne '/^declare -- [m-p]/p'
ale ten druhý kombinuje veklá i malá písmena O__O. Asi přestanu používat Gentoo :/
To je divny. Co kdyz zkusis tohle?

Kód: [Vybrat]
#  echo 'a' | sed -n '/[a-z]/p'
a
#  echo 'a' | sed -n '/[A-Z]/p'
#  echo 'A' | sed -n '/[A-Z]/p'
A
#  echo 'a' | sed -n '/[A-Z]/p'
#

Jinak ten puvodni pokus ti mozna nemusi fungovat, protoze v klasickych RE je + normalni znak. Zkus pridat -E:
Kód: [Vybrat]
# echo 'aaa' | sed -n '/a+/p'
# echo 'aaa' | sed -En '/a+/p'
aaa

Citace
     -E      Interpret regular expressions as extended (modern) regular
             expressions rather than basic regular expressions (BRE's).  The
             re_format(7) manual page fully describes both formats.

Re:Regulární výraz v sed nefunguje
« Odpověď #7 kdy: 15. 01. 2013, 12:56:42 »
Tak to vypadá, že příkaz mám dobře, ale na 64b sedu mi to dává špatné výsledky, zatímco na 32b systému mi to funguje :(

Mimochodem úplné řešení je:
declare -p | sed -ne 's/declare -- \([a-z][a-z0-9_]*\)=.*$/\1/p'

Re:Regulární výraz v sed nefunguje
« Odpověď #8 kdy: 15. 01. 2013, 12:57:49 »
Tak to vypadá, že příkaz mám dobře, ale na 64b sedu mi to dává špatné výsledky, zatímco na 32b systému mi to funguje :(
To me hodne zajima, hod jsem nejaky co nejjednodussi priklad, jak ti to dava spatny vysledek.

Re:Regulární výraz v sed nefunguje
« Odpověď #9 kdy: 15. 01. 2013, 12:59:09 »
Prýmek: No to -E by bylo hezký, kdyby sed tenhle opšn měl :) Podle mě a manuálových stránek má -E jen grep :) ale máš pravdu, že plusko v BRE není, musel jsem to mírně upravit. Nicméně můj problém s rozbitám 64b sedem to tak jako tak neřeší :/

Re:Regulární výraz v sed nefunguje
« Odpověď #10 kdy: 15. 01. 2013, 13:04:23 »
Tak to vypadá, že příkaz mám dobře, ale na 64b sedu mi to dává špatné výsledky, zatímco na 32b systému mi to funguje :(
To me hodne zajima, hod jsem nejaky co nejjednodussi priklad, jak ti to dava spatny vysledek.

Kód: [Vybrat]
declare -p | sed -ne '/^declare -- [a-z]/p'

mi vypíše:
Kód: [Vybrat]
declare -- BASH="/bin/bash"
declare -- BASH_COMMAND
declare -- BASH_SUBSHELL
declare -- BASH_VERSION="4.2.37(1)-release"
declare -- COLUMNS="99"
declare -- COMP_WORDBREAKS
declare -- HISTFILE="/home/neburka/.bash_history"
declare -- HISTFILESIZE="500"
declare -- HISTSIZE="500"
declare -- HOSTNAME="neburkalenovo"
declare -- HOSTTYPE="x86_64"
declare -- IFS="       
declare -- LINES="44"
declare -- MACHTYPE="x86_64-pc-linux-gnu"
declare -- OPTERR="1"
declare -- OSTYPE="linux-gnu"
declare -- PROMPT_COMMAND="echo -ne \"\\033_\${USER}@\${HOSTNAME%%.*}:\${PWD/#\$HOME/~}\\033\\\\\""
declare -- PS1="\\[\\033[01;32m\\]\\u@\\h\\[\\033[01;34m\\] \\w \\\$\\[\\033[00m\\] "
declare -- PS2="> "
declare -- PS4="+ "
declare -- SECONDS

Ještě mám dva typy: buď mám nějak špatně lokalizaci, nebo tomu vadí, že je to přeložené s nls :/

Re:Regulární výraz v sed nefunguje
« Odpověď #11 kdy: 15. 01. 2013, 13:08:11 »
Tak to je vtipny. Takze
Kód: [Vybrat]
echo 'a' | sed -n '/[a-z]/p' nevypise nic?

A verze os a sedu?

Re:Regulární výraz v sed nefunguje
« Odpověď #12 kdy: 15. 01. 2013, 13:12:23 »
Tak to je vtipny. Takze
Kód: [Vybrat]
echo 'a' | sed -n '/[a-z]/p' nevypise nic?

A verze os a sedu?

vypíše:
a
ale to je v pořádku

Re:Regulární výraz v sed nefunguje
« Odpověď #13 kdy: 15. 01. 2013, 13:14:11 »
Takze blbne jenom tohle?

Kód: [Vybrat]
# echo 'A' | sed -n '/[a-z]/p'

Re:Regulární výraz v sed nefunguje
« Odpověď #14 kdy: 15. 01. 2013, 13:14:59 »
3.6.11-gentoo
GNU sed version 4.2.1