Sziasztok.
Eddig nem volt különösebb problémám, mert rögösebb úton, hosszú és ronda sorokkal megoldottam a szkriptjeimet valahogy (cat, sed és awk a kedvencem). Anno a C tanárom mondta, hogy neki mindegy, milyen hosszú egy program, ha működik. akkor igazat adtam neki, mert leizzadtam, mire megoldottam amit kellett. (10 éve?)
Most elkezdtem gondolkodni azon, hogy nem lehetne-e néhány dolgot SZEBBEN és rövidebben megoldani.
Az alábbiak egyikét pl. awk-ban a mezőelválasztó átírásával oldanám meg ma is, na erre mondanák itt sokan, hogy ronda..
Szóval itt áll két tuti rövid dolog, amit hosszú utasítássor nélkül biztosan nem tudnék megcsinálni:
1.
unixos-dózeres sorvégjelek a szövegfájl végén. Ezek mindegyike legyen kicserélve SPACE-re vagy TAB-ra ahogy épp jólesik, azaz minden sorvégjel egy megadott stringre cserélődjön. Értelemszerűen legegyszerűbb ilyenkor rátolni a sed-re, de mégsem... Vagy a kéféle sorvégjelnek van egy Hexa kódja és azzal is menne a sed?
2.
Megadott stringet tartalmazó sor elején tűnjön el egy string, vagy kerüljön oda (pl. #)
Ezt is halál hosszú és randa sorokkal oldottam meg amikor éppen kellett.
Szóval két ilyen dolgot ki-ki hogyan oldana meg nagyon röviden? (Nem úgy mint én, hogy külső szkriptet hívtam meg...)
- 166268 megtekintés
Hozzászólások
Ezek egyszerűek:
1. tr '\n' ' ' < file.txt
2. sed -i '/string_amit_a_sor_tartalmaz/s/\(.*\)/#\1/' file.txt
^- ha eltüntetni kell valamit az elejéről, azt is lehet sed-del
- A hozzászóláshoz be kell jelentkezni
1. tr '\r\n' ' ' < file.txt
2. sed -i '/string/s/^/#/' file.txt
- A hozzászóláshoz be kell jelentkezni
kötekedés: a tr-nek kell a -s opció, különben egy DOS-sorvéges fájlban 2 db szóközzel választja el a sorokat, a (szerintem sokkal korrektebb) 1 helyett.
(Ja, és a feltételben sztringre kell cserélni a sorvégjelet, a tr viszont karakerre cserél, szóval lehet inkább sed -del kellene trükközni.)
- A hozzászóláshoz be kell jelentkezni
Akkor viszont lehet perl-el is csinálni egyszerűen, pl: perl -p -i -e 's/\n/string/' file.txt
vagy seddel (GNU!)
':a;N;$!ba;s/\n/string/g'
vagy esetleg
sed '{:a;N;s/\n/string/g;t a}'
- A hozzászóláshoz be kell jelentkezni
Csak hogy tovább szépítsem:
sed -i ':a;N;$!ba;s/\(\r\n\|\n\|\r\)/lulz/g' file.txt
vagy ha már úgy is gsed:
sed -ri ':a;N;$!ba;s/(\r\n|\n|\r)/lulz/g' file.txt
- A hozzászóláshoz be kell jelentkezni
Azért helyette ne rágjuk már meg a kaját, kell egy kis önállóság is :)
--
HUPbeszolas FF extension
- A hozzászóláshoz be kell jelentkezni
A sed-ben mi az ami GNU-specifikus, mert így első ránézésre (teszteletlenül) mennie kéne másutt is?
- A hozzászóláshoz be kell jelentkezni
BSD-ssel nem megy, hogy konkrétan mi miatt, nem néztem utána.
--
HUPbeszolas FF extension
- A hozzászóláshoz be kell jelentkezni
No megnéztem, két hiba is van benne, amit nem szeret a FreeBSD natív sed-je:
- az első a ":a;N..." - azaz a cimke definiálása parancsra ";N..." "unused label" -t ír
- a második pedig ugyanennek a cimkének a használatánál, azaz az ugró parancsnál "$!ba;s" pedig "undefined label" -t mond.
Azt kell mondjam, mind a kettő legalábbis kérdéses, hogy kell-e mögé soremelés. Elsőre azt gondoltam, hogy kell, aztán úgy gondoltam, hogy mégse :-) - ez valószínűleg FreeBSD sed-hiba, hogy nem veszi észre, hogy a ; lezárja a cimkéket.
Szóval ha nem egy sorba írjuk a parancsokat ; -vel elválasztva, hanem legalább ennél a két parancsnál rakunk be egy ENTER-t a sed-parancs mögé, esetleg három db parancsként,
sed -e ':a' -e 'N;$!ba' -e 's/\n/string/g'
formában, akkor működik (kipróbálva).
- A hozzászóláshoz be kell jelentkezni
Jogos. Köszönöm a javítást!
A string felett elsiklottam, de azt már nem is triviális sed-el megoldani. Bár kinek mi számít elegánsnak. :)
- A hozzászóláshoz be kell jelentkezni
ő izé ez mit is jelent pontosan:
s/\(.*\)/#\1/
A -i oké, insert, az s/ a csere 1x a (.*) hogy bármit de a #\1 az mi? Nem értem?
--
A legértékesebb idő a pillanat amelyben élsz.
http://phoenix-art.hanzo.hu/
- A hozzászóláshoz be kell jelentkezni
Most azt kérded, hogy nem érted-e? :)
Röviden... a ()-be foglalt rész a \1 helyére behelyettesítődik. Részletesebben pedig google :)
--
HUPbeszolas FF extension
- A hozzászóláshoz be kell jelentkezni
valóban elírtam :D lehet nem pezsgőzés után kéne ilyeneket irogatni :)
amit nem értek az a hashmark #.
--
A legértékesebb idő a pillanat amelyben élsz.
http://phoenix-art.hanzo.hu/
- A hozzászóláshoz be kell jelentkezni
viszotn most hogy leírtam már értem. bocsesz ;P
--
A legértékesebb idő a pillanat amelyben élsz.
http://phoenix-art.hanzo.hu/
- A hozzászóláshoz be kell jelentkezni
> A -i oké, insert,
nem, egy (elsősorban) GNU-bővítmény arra, hogy a sed helyben módosítsa a fájlt. Ne keverd a "-i" opciót az "i" szerkesztőparanccsal!
- A hozzászóláshoz be kell jelentkezni
Pedig ezt az egy opciot betehtetnek a stict POSIX sedbe is.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
A gyakorlati használhatóságával egyetértek, az más kérdés, hogy a "filter" fogalommal szöges ellentétben van, így konzervatívok jogosan kiabálnak ellene (és használják közben :-) ).
- A hozzászóláshoz be kell jelentkezni
És mindkettőtöknek igaza van :-) A sed stream editor, helyben matatásra az ed lett kitalálva, vagy nem?
- A hozzászóláshoz be kell jelentkezni
ó valóban. köszönöm
--
A legértékesebb idő a pillanat amelyben élsz.
http://phoenix-art.hanzo.hu/
- A hozzászóláshoz be kell jelentkezni
Amindenit!
:)
Szerintem előszedem azokat a szkripteket, melyeket rondán írtam meg anno. valami képátméretezős-rendszerezős valami volt.
Lassan elkezdek szebben írni.
Kösz a sugallatokat, végigpróbálom mindet.
Pl. a tr-t aszem' még sosem használtam.
---
--- A gond akkor van, ha látszólag minden működik. ---
---
- A hozzászóláshoz be kell jelentkezni
Az a kemeny hogy ez C-ben megirva is szebb mint barmelyik itt felettem :>
--
cythoon
- A hozzászóláshoz be kell jelentkezni
>>> Az a kemeny hogy ez C-ben megirva is szebb mint barmelyik itt felettem :>
Az lehet, de itt pont az volt a kérdés, hogy szkriptben hogy lehet szépen megírni...
G.
============================================
"Share what you know. Learn what you don't."
- A hozzászóláshoz be kell jelentkezni