Portál AbcLinuxu, 9. května 2025 00:40
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
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 vypiseProblém není u echo, ale u read, který přeskočí počáteční mezery.
a aby to vypisovalo i tyto mezeryTo záleží, co s tím chcete dál dělat - nestačilo by to řešit rourou/použít AWK/...
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.
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
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.
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.txtnebo ve skriptu
while IFS=" " read line; do echo "$line"; done < a.txtNo a někdy když řádek nepotřebujete dělit se hodí i to
$REPLY
níže.
while read do echo "$REPLY" done
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 :)
'
Uz jsem na to prisel, posledni vec uz je jenom jak nahradit znaky < > & za sve html ekvivalenty:
gsub("&","&") funguje
gsub(">",">") tyto dva nefunguji, kdyz jsem pouzil escape sekveni \> napr, tak bash hodi warning warning: escape sequence `\&' treated as plain `&'
gsub("<","<")
Diky moc za rady.
mne to funguje takto:
awk '{gsub(/&/, "\\&"); gsub(/</, "\\<"); gsub(/>/, "\\>"); print}' subor
upravene podla www.delorie.com/gnu/docs/gawk/gawk_136.html .
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.