Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: host 19. 08. 2013, 10:41:23
-
Dobrý den,
řeším problém kdy potřebuji v cyklu přečíst txt soubor a při čtení řádků uvnitř cyklu rozdělovat tyto řádky na řádky začínající pomlčkou a žádky nezačínající pomlčkou. Napadlo mě udělat nějaký if který by to řešil a dát mu nějaký regulární výraz. Mé pokusy skončily neúspěchem...
for i in $(cat pokus.txt)
do
if [[ "$i" =~ '^[-]' ]]; then
echo $i
fi
done
Mohli byste mi poradit jak na to?? Děkuji
-
Pokud chceš jen vybrat řádky začínající pomlčkou, tak by mělo stačit
egrep '^-' [soubor] > soubor.radky-s-pomlckou
Řádky nezačínající pomlčkou pak:
egrep -v '^-' [soubor] > soubor.radky-s-pomlckou
-
for i in $(cat pokus.txt) nečte řádky, ale slova. Řádky čte cat pokus.txt | while read i.
Druhý problém je, že ten regulární výraz se neuzavírá do uvozovek:[[ "$i" =~ ^- ]]
-
Pokud chceš jen vybrat řádky začínající pomlčkou, tak by mělo stačit
egrep '^-' [soubor] > soubor.radky-s-pomlckou
Řádky nezačínající pomlčkou pak:
egrep -v '^-' [soubor] > soubor.radky-s-pomlckou
A pokud jsi s těma řádkama chtěl něco dělat, tak zkus třeba:
while read RADEK; do
echo ${RADEK}|egrep '^-' 1>/dev/null && {
# radek s pomlckou na zacatku
...
} || {
# radek bez pomlcky na zacatku
...
}
done < [soubor]
-
A pokud jsi s těma řádkama chtěl něco dělat, tak zkus třeba:
while read RADEK; do
echo ${RADEK}|egrep '^-' 1>/dev/null && {
# radek s pomlckou na zacatku
...
} || {
# radek bez pomlcky na zacatku
...
}
done < [soubor]
egrep má parametr -q, aby se nemusel přesměrovávat do /dev/null.
A potom je tam jeden potenciální zdroj chyb, pokud poslední příkaz v prvním bloku („radek s pomlckou na zacatku“) vrátí chybu, provede se i druhý blok.
-
Nebo bez toho egrepu:
#!/bin/bash
while read i; do
if [[ $i == -* ]]; then
echo "zacina pomlckou: $i"
else
echo "nezacina pomlckou: $i"
fi
done < pokus.txt
Jestli chces jenom vypsat radky zacinajici pomlckou, staci sed -n '/^-/ p' pokus.txt.
-
Není jednodušší a přehlednější tohle, než všechny ty kryptické zápisy v bashi?
#!/usr/bin/env python
for line in open("pokus.txt"):
if line.startswith("-"):
print "Radek s pomlckou:", line
else:
print "Radek bez pomlcky:", line
-
...
egrep má parametr -q, aby se nemusel přesměrovávat do /dev/null.
A potom je tam jeden potenciální zdroj chyb, pokud poslední příkaz v prvním bloku („radek s pomlckou na zacatku“) vrátí chybu, provede se i druhý blok.
Mno, též jsem to mohl doplnit o test, zda existuje ten vstupní soubor a esli z něj jde číst.
Ale máš samozřejmě pravdu. Je to bez kontrol a to přesměrování do devnullu je tam jen proto, aby ho výpis nemátl, kdyby to zkoušel.
Prostě jen hrubý nástřel, detaily by si měl už doladit sám ...
-
Není jednodušší a přehlednější tohle, než všechny ty kryptické zápisy v bashi?
...
Ach jo.
Taky jsme mohli poradit něco v c++.
Nebo v brainfucku?
Tazatel začal ukázkou ve skriptu, tak se v tom dál pokračovalo, no.
-
Taky jsme mohli poradit něco v c++.
Nebo v brainfucku?
Tazatel začal ukázkou ve skriptu, tak se v tom dál pokračovalo, no.
Jen se snažím tazazeli naznačit, že si ušetří spoustu problémů, když na bash rychle zapomene a vybere si něco udržovatelnějšího ;). Jestli se tím bude řídit, je jen na něm.
-
Jen se snažím tazazeli naznačit, že si ušetří spoustu problémů, když na bash rychle zapomene a vybere si něco udržovatelnějšího ;). Jestli se tím bude řídit, je jen na něm.
Je to samozrejme na nem, ale jestli se zabyva linuxem, tak si spis usetri hodne problemu, kdyz se ten bash nauci. IMHO shell a coreutils jsou zaklad. Jsou v kazdem unixu a krypticky se jevi jen tem, kteri je neznaji. Admini i programatori si ze zrejmych duvodu pisi svoje skripty v pythonu, perlu apod., ale bez znalosti tech zakladu by se stejne potykali s problemy.
-
Je to samozrejme na nem, ale jestli se zabyva linuxem, tak si spis usetri hodne problemu, kdyz se ten bash nauci. IMHO shell a coreutils jsou zaklad. Jsou v kazdem unixu a krypticky se jevi jen tem, kteri je neznaji. Admini i programatori si ze zrejmych duvodu pisi svoje skripty v pythonu, perlu apod., ale bez znalosti tech zakladu by se stejne potykali s problemy.
To je věc názoru, ale tohle téma na mě zatím působí tak, že bash na takové úrovni, aby v něm byl schopen napsat načtení souboru a otestování, že řádek začíná pomlčkou, zvládně bez chyb možná tak Sten a jinak nikdo. Což může znamenat, že všichni kromě Stena jsou blbci, nebo že je bash opravdu tak kryptický, že je lepší se mu vyhnout (nebo obojí :) ).
-
To je věc názoru, ale tohle téma na mě zatím působí tak, že bash na takové úrovni, aby v něm byl schopen napsat načtení souboru a otestování, že řádek začíná pomlčkou, zvládně bez chyb možná tak Sten a jinak nikdo. Což může znamenat, že všichni kromě Stena jsou blbci, nebo že je bash opravdu tak kryptický, že je lepší se mu vyhnout (nebo obojí :) ).
Souhlasim, lidi se nauci nejake zaklady shellu, aby zvladli jednoduche skripty, a pak se vrhnou na nejaky mocnejsi jazyk. Studuji ho mnohem dukladneji a delaji v nem vetsinu prace. Asi ani nemaji chut se vracet k tomu shellu. Stazene tutorialy lezi nekde v adresari a cekaji, ze si je mozna jednou nekdo precte. Myslim, ze kdyby clovek venoval studiu shellu zlomek casu, ktery venuje treba pythonu, tak by nemel problem s vyse popsanym trivialnim ukolem. Jiste je to jen otazka pristupu, uzivatele to moc nepotrebuji a svoje skripty si nejak sepisou nebo vygoogli. Sam jsem psal nejake podle me super skripty v perlu a pak prisel zkuseny admin a zahanbil me resenim v shellu na jeden radek.
-
Nezapomínat na awk.
awk ' { if ( $0 ~ /^-/ ) { print $0 } else { print "rum" } } ' /temp/soubor
-
Případně bych zkusil Perl:
cat vstup.txt | perl -ne 'if (/^-/) { print "S: $_"; } else { print "BEZ: $_"; }'
:-)
-
Jestli je to soutěž, jak to napsat na jeden řádek a co nejvíc zatemnit, tak python v ničem nezaostává
print map(lambda x: "S pomlckou:" + x if x.startswith("-") else "Bez pomlcky:" + x, open("pokus.txt"))
-
Jestli to byla narážka na mě, tak ne – Perl mi přijde přehledný, jsou v něm normální závorky (ne jako v Pythonu) a dobře se tenhle zápis čte.
-
for i in $(cat pokus.txt) nečte řádky, ale slova. Řádky čte cat pokus.txt | while read i.
Druhý problém je, že ten regulární výraz se neuzavírá do uvozovek:[[ "$i" =~ ^- ]]
teraz mam po ruke len osx, kde to funguje nasledovne:
IFS=$'\n' ; for i in `cat pokus.txt` ; do if echo ${i} | grep -q "^-" 2>/dev/null ; then echo S: ${i}; else echo BEZ: ${i} ; fi ; done
-
Jen se snažím tazazeli naznačit, že si ušetří spoustu problémů, když na bash rychle zapomene a vybere si něco udržovatelnějšího ;). Jestli se tím bude řídit, je jen na něm.
Je to samozrejme na nem, ale jestli se zabyva linuxem, tak si spis usetri hodne problemu, kdyz se ten bash nauci. IMHO shell a coreutils jsou zaklad. Jsou v kazdem unixu a krypticky se jevi jen tem, kteri je neznaji. Admini i programatori si ze zrejmych duvodu pisi svoje skripty v pythonu, perlu apod., ale bez znalosti tech zakladu by se stejne potykali s problemy.
... recnicka otazka zni jak dlouho jeste /trololo