Nahrazení řetězce pomocí reg. výrazu

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #30 kdy: 27. 03. 2010, 10:23:54 »
Citace
Spise ted:

i++

V bash-i (ver. 3.2.39) nefunguje ani i++, ani i=$((i++)) ...


webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #31 kdy: 31. 03. 2010, 18:51:38 »
V jednom svém skriptu jsem našel tohle řešení:

Kód: [Vybrat]
let "n += 1";
let "c=($n+1)";

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #32 kdy: 06. 04. 2010, 16:54:03 »
Tak zase řeším to co na začátku. Už mi to fungovalo, ale teď jsem nějak rozdrfal nastavení IFS a awk nefunguje:

JAK NASTAVIT IFS u příkazu awk?

Používám IFS=$' ' nebo IFS=$''

Mám výpis z blkid:
/dev/sda7: UUID="4FC71FC14B14ADA0" LABEL="PROGRAMY" TYPE="ntfs"
/dev/sda9: UUID="58E75A17692994A5" LABEL="ARCHIV" TYPE="ntfs"

A filtr:
fs=$(echo $line | awk '{print substr($4,7,length($4)-7)}');
Hledá typ FS na čtvrtém sloupci. A funguje správně.

Ale:
/dev/sda8: UUID="4E64923958B30394" LABEL="Fotky a hudba" TYPE="ntfs"
fs=$(echo $line | awk '{print substr($6,7,length($6)-7)}');
Nalézá na 6. sloupci. Špatně. Jak oddělovač počítá každou mezeru.

Jak to vyřešit, aby vše bylo správně pod čtvrtým sloupcem?

Dík
« Poslední změna: 06. 04. 2010, 16:58:18 od webhope webhope »

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #33 kdy: 06. 04. 2010, 18:30:45 »
Ak na vstupe nie je oddelovac, tak sa ziadny ani cez IFS neda nastavit ... mozno by sa dal pouzit znak rovna sa ...

Vyber polozky TYPE sa da v bashi urobit napr. takto:

Kód: [Vybrat]
line='/dev/sda8: UUID="4E64923958B30394" LABEL="Fotky a hudba" TYPE="ntfs"'

fs="${line#*TYPE=\"}"
fs="${fs%\"*}"

echo "Suborovy system: $fs"

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #34 kdy: 06. 04. 2010, 18:38:20 »
Ak by TYPE nebolo vzdy na konci, tak:

Kód: [Vybrat]
fs="${line#*TYPE=\"}"
fs="${fs%%\"*}"


webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #35 kdy: 06. 04. 2010, 21:49:22 »
Teď to ale nechápu. Myslel jsem, že když dělám v bashi jakýkoliv výpis, že ten awk to umí spolehlivě rozpoznat který odstavec je který. Jakmile v odstavci je mezera tak on to bude interpretovat špatně? Nepomohlo by nastavit IFS na tabulator? Já to zkusím.

Edit
Tak nic.

To TYPE není vždy poslední. Nepomohl by regulární výraz? Něco jako TYPE="(+)" ale nevím jak to použít a jak vytáhnout zachycený vnořený obsah
« Poslední změna: 06. 04. 2010, 22:24:41 od webhope webhope »

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #36 kdy: 06. 04. 2010, 22:36:36 »
riesenie je vyssie (to druhe funguje pre TYPE na lubovolnej pozicii, ak samozrejme nazov tyou neobsahuje uvodzovky)... Samozrejme sa to da aj cez regularne vyrazy

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #37 kdy: 06. 04. 2010, 23:04:40 »
Tak tohle už funguje. Ale potřeboval bych ještě regulární výraz na odstranění všech mezer (nebo tabulátorů), které jsou na konci řetězce.
Tohle je asi poslední bug, tak už snad nebudu mít víc otázek.
« Poslední změna: 06. 04. 2010, 23:13:17 od webhope webhope »

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #38 kdy: 06. 04. 2010, 23:21:21 »
Citace
potřeboval bych ještě regulární výraz na odstranění všech mezer (nebo tabulátorů), které jsou na konci řetězce.

Kód: [Vybrat]
echo $line | sed -r 's/[ \t]+$//'

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #39 kdy: 06. 04. 2010, 23:47:45 »
OK, dík. Ale zvláštní, nějak mi to nezabralo.

Toto je zdrojový řetězec:
'SATA XP=>$default_main_dir/XP   '

Je tam dolar, jestli to nepochopil jinak

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #40 kdy: 07. 04. 2010, 05:35:11 »
A urcite je na konci medzera alebo tabulator???
Kód: [Vybrat]
echo "$line" | cat -t
Skus:
Kód: [Vybrat]
echo $line | sed -r 's/\s+$//'

Ak funguje, tak na konci bol iny znak zo skupiny whitespace

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #41 kdy: 07. 04. 2010, 10:20:08 »
Tak byl tam bílý znak. Ale to se divím, vstup jsem zadával přes klávesnici jako mezeru nebo tab.

Původní pole se kterým jsem pracoval ještě obsahuje prázdné řádky (takže to špatně vypočítá počet cyklů)

attach_dirs=( "
SATA XP=>$default_main_dir/XP
PROGRAMY=>$default_main_dir/PROGRAMY
INSTALL=>$default_main_dir/INSTALL

ARCHIV=>$default_main_dir/ARCHIV
HRY=>$default_main_dir/HRY
ZALOHY=>$default_main_dir/ZALOHY
VIDEO=>$default_main_dir/VIDEO
);

když dám
Kód: [Vybrat]
echo -e $attach_dirs tak se mi nezobrazí odřádkování.

Z původního pole jsem odfiltroval prázdné řádky:
Kód: [Vybrat]
echo -e $attach_dirs | sed -r 's/^\n$//'

Ale nemám jak ověřit, že tam ty řádky nejsou, protože se mi nezobrazí v tom odřádkovaném formátu. Jak na to?

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #42 kdy: 07. 04. 2010, 11:46:24 »
Prazdne riadky sa "odfiltruju" takto (neobsahuju nic, ziaden znak):

Kód: [Vybrat]
sed '/^$/d'

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #43 kdy: 07. 04. 2010, 13:36:20 »
Díky za pomoc. Funguje to. Teď ještě řeším problém s ukončením cyklu