Portál AbcLinuxu, 23. dubna 2024 09:28


Dotaz: Echo s mezerami

24.3.2009 19:10 LorD_OniX
Echo s mezerami
Přečteno: 338×
Odpovědět | Admin

Ahoj, mam skipt:

- ocekava na svem vstupu cteni z stdin, takze mu posleme pres cat libovolny soubor

- tento skript tento soubor zpracovava

- v tomto skriptu jsem si dal cteni toho souboru po radcich, syntax:

while read line

do

    echo "$line"

done

- toto funguje skvele (vstupem jsou data vstupniho souboru), ale echo ma jednu nezadouci vlastnost a tu, ze

kdyz je ve vstupnim souboru na radku libovolny pocet mezer nasledovany textem, echo nikdy tyto mezery nevypise a vypise

radek az od prvniho vyskytu textu. Potreboval bych proto od vas kdo mate dobre zkusenosti s bashem, jak byste v cyklu resili

postupne prochazeni souboru po radcich a aby to vypisovalo i tyto mezery, popripade nejak to implementovat do toho cyklu

co jsem napsal ja. Predem moc dekuji

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

24.3.2009 19:34 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Echo s mezerami
Odpovědět | | Sbalit | Link | Blokovat | Admin
ale echo ma jednu nezadouci vlastnost a tu, ze kdyz je ve vstupnim souboru na radku libovolny pocet mezer nasledovany textem, echo nikdy tyto mezery nevypise a vypise
Problém není u echo, ale u read, který přeskočí počáteční mezery.
a aby to vypisovalo i tyto mezery
To záleží, co s tím chcete dál dělat - nestačilo by to řešit rourou/použít AWK/...
I am always ready to learn although I do not always like to be taught. (W. Churchill)
24.3.2009 19:37 LorD_OniX
Rozbalit Rozbalit vše Re: Echo s mezerami

Dekuji moc za tu vasi odpoved. Ja bych potreboval to nejak nacitat ( nejlepe po radcich), abych tyto radky mohl zpracovavat ci upravovat. A prave potrebuji aby

to nacitalo do nejake promenne i ty mezery, ktere jak jste rekl funkce read orezava. Bohuzel nevim jak pres rouru to resit. Pres awk taky nevim, ja

uz mam napsany cely skript v bashi a jenom bych potreboval si tam nejak vlozit tuto funkci do promenne abych s ni mohl dale pracovat. Pokud ale mate

lepsi napad, napiste, budu moc rad.

24.3.2009 19:45 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Echo s mezerami
abych tyto radky mohl zpracovavat ci upravovat

Kupodivu :-). Jde o to, co s nimi chcete dělat.

Pokud ale mate lepsi napad, napiste, budu moc rad.

Jeden bych měl - nezalamujte řádky, pokud nekončí odstavec. Díky

I am always ready to learn although I do not always like to be taught. (W. Churchill)
24.3.2009 23:09 deadmail
Rozbalit Rozbalit vše Re: Echo s mezerami
Da sa zmenit oddelovac v bashi.

Takze pred cyklus while nastavit napr. IFS="@". Potom uz medzery na zaciatku nacita v poriadku - fungovat to bude ale len ak na zaciatku ziadneho riadku nie je zavinac(@).

Treba zvolit znak, ktory sa urcite v subore nenachadza ako prvy znak v riadku.
25.3.2009 18:24 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Echo s mezerami
Viděl bych jako rozumné jako oddělovač zvolit právě znak pro nový řádek, místo obvyklá svaté trojice LF,TAB,SPACE...
while IFS="^M" read line; do
  echo "$line";
done < soubor.txt
^M lze vložit buď ctrl+v + enter, nebo prostě
bash$ while IFS="
> " read line; do echo "$line"; done < a.txt
nebo ve skriptu
while IFS="
" read line; do
  echo "$line";
done < a.txt
No a někdy když řádek nepotřebujete dělit se hodí i to $REPLY níže.
24.3.2009 23:14 deadmail
Rozbalit Rozbalit vše Re: Echo s mezerami
nasiel som aj druhu moznost v bashi:
while read
do
    echo "$REPLY"
done
kozzi avatar 24.3.2009 23:44 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: Echo s mezerami
Odpovědět | | Sbalit | Link | Blokovat | Admin
Doporucuju pouzit gawk (awk nee nejelo by ti to na adele ;-)). Jinak já osobně sem třetí část projektu napsal na jeden řádke v sedu, ale takovou prasárnu svět ještě neviěl :-D
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
25.3.2009 17:46 LorD_OniX
Rozbalit Rozbalit vše Re: Echo s mezerami

Taky jsem videl u kamose jednou velkou rouru se sedem. Zkusil jsem ten field separator a funguje to, strasne moc diky. Nenapadla me takovato vec. Pokud jeste muzete odpoved, tak se me podarilo prepsat tento skript awk, ale zarazil jsem se u jedne veci:

 

cat soubor | awk '

/libovolny reg. vyraz/ {

 #prikazy

a tady v tomto miste bych potreboval z promenne $0 vypsat text, ktery bych nejak upravil pres regularni vyraz. Jenze kdyz napisu

/libovolny reg. vyraz/ { print }, tak bash hodi chybu, protoze tato syntaxe neni dovolena

mam knizku s awk a nic jsem tam na tento zpusob nenasel nebo kdyby do promenne sel ulozit reg. vyraz

umim delat hodne jenom v sedu a nevim jestli ma awk neco taky na substuci, abych si mohl s toho reg. vyrazu vytahnout co potrebuju

}

Diky moc za odpovedi a za predesle rady :)

'

25.3.2009 18:39 LorD_OniX
Rozbalit Rozbalit vše Re: Echo s mezerami

Uz jsem na to prisel, posledni vec uz je jenom jak nahradit znaky < > & za sve html ekvivalenty:

gsub("&","&amp;") funguje
gsub(">","&gt;") tyto dva nefunguji, kdyz jsem pouzil escape sekveni \&gt; napr, tak bash hodi warning  warning: escape sequence `\&' treated as plain `&'
gsub("<","&lt;")

Diky moc za rady.

26.3.2009 10:03 deadmail
Rozbalit Rozbalit vše Re: Echo s mezerami

mne to funguje takto:

awk '{gsub(/&/, "\\&amp;");
gsub(/</, "\\&lt;");
gsub(/>/, "\\&gt;");
print}' subor

upravene podla www.delorie.com/gnu/docs/gawk/gawk_136.html .

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.