sed kérés

Adott egy külső merevlemez, melynek tartalmáról a tree paranccsal készítek egy listát.

tree -hnNI '*.srt|*.idx|*.sub' ${from_path} >> ${to_path}/${name}.txt

Amikor mappához ér akkor ez lesz látható: ├── [4.0K] Akció
Nos én nem értek a sed-hez, de szerintem ezzel lehetne a leghatékonyabban megoldani hogy az [4.0K] eltűnjön, és csak ez maradjon:
├── Akció
│   ├── [701M] 16 utca - 2006.avi

Minden mappának ez a mérete amely a listában található [4.0K].

Hozzászólások

Tegyél a tree opciói közé egy -F kapcsolót is, akkor a sor végén lesz egy "/", ha könyvtárról van szó!
Így (nem tudnám a pontos regexp-t felírni) már megoldható a feladat.
A jelenlegi formával az a gond, hogy önmagában a 4.0K nem feltétlenül jelöl könyvtárat, tehát azt kicserélni értelmetlen lenne.

Még megpróbálom végiggondolni, hogy is lehetne törölni a könyvtár méretét.

update:

tree -hnNIF . | sed -r 's/(^.*)\[.*\](.*\/$)/\1\2/'
vagy
tree -hnNIF . | sed -r 's/(^.*)\[.*\](.*)\/$/\1\2/'

Kb. így...

Félreértesz: úgy értettem, hogy nem tud minta alapján válogatni és az így kiválasztott sorokon dolgozni, csak a szerkesztő parancs saját mintáját tudja használni.

Kötekedés on: az enyém akkor is jobb, mert a felesleges /-t én törlöm is. A tiédhez asszem, elég lenne a -e is a -r helyett. ;)

Köszi szépen. Ez tetszik, de ha leírnád hogy mégis mi mit csinál akkor talán meg is érteném.
A -r azt értem. Beolvassa a fájl sorait, és a módosítást kiírja majd jön a következő sor.
Na de a többi?

Láttam egyszer egy ilyet:
sed 's/\/home\/bagoj\/bin/\/usr\/bagojne/' és helyette egy sokkal érthetőbbet:
sed 's:/home/bagoj/bin:/usr/bagojne:g'

sed -r '/\/$/ s@\[.*\](.*)\/$@\1@'

Elemzés:

/\/$/

Ezzel kijelöljük, hogy csak azokat a sorokat kell nézni, aminek a végén perjel van. A reguláris kifejezést kettő perjel közé rakjuk, ez mondja meg a sed-nek, hogy nem minden sorra kell a parancsot végrehajtani. A \/ jelenti a perjelet (nyilván védeni kell, nehogy azt higgye a sed, hogy rögtön vége is van). A dollárjel meg a sor végére illeszti a perjelet.

s@\[.*\](.*)\/$@\1@

A lényegi parancs, amelyet csak azokon a sorokon hajtunk végre, amelyek megfelelnek az előzőekben leírt feltételnek (tehát az uccsó karakter perjel). Az s mondja meg, hogy most csere lesz.
A következő karakter lesz egy "elválasztó" karakter (én a kukac karaktert szoktam, mert bazinagy, látszik messziről, hol vannak a határok és mintában viszonylag ritkán használom - email-címeket nem szoktam variálni). Amennyire tudom, túlzottan nagy megkötés nincs (a bagjos példáidban az elsőben a perjel az elválasztó, ami abból szívás, mert elérési utat variálsz, ami tele van perjellel, ezért a másodikban az elválasztó a kettőspont, így az elérési utakban levő perjeleket nem kell védeni, nem félreérthetőek).
Az első paraméter (\[.*\](.*)\/$) azt mondja, hogy keress két szögletes zárójel közötti karakterhalmazt (a szögletes zárójelet is védeni kell, mivel annak is van speciális jelentése, tehát most nem speciális jelentést akarunk, hanem szögletes-zárójel-karaktert), utána meg keress bármit, amit jegyezz meg (a megjegyzésre a zárójel utasít, a megjegyzendő dolog két zárójel között van, a .* aszondja, hogy bármi akárhányszor), majd legyen egy perjel, és utána sorvég.
A második paraméter (\1) mutatja meg, hogy az első paramétert mire kell cserélni. A \1 azt mondja, hogy az első megjegyzett dologra cseréljük le (persze lehetne mondjuk "kutyagumi"-ra is mindent, de akkor nem azt csinálná, amit szeretnél).
Utána lezárjuk az egészet, és még utána lehet egyéb opciókat írni (pl. g hatására nem csak az első előfordulást cseréli (ez az alapértelmezett), hanem az összeset a sorban).

Kb. ennyi. Nézz utána a sed-nek és a szabályos kifejezéseknek (regular expression), magyarul is sok írás van róluk.

Ha a tree parancshoz esetleg egy -p opciót hozzáveszel? Ekkor ls -l-szerűen listázza a dolgokat, amiből már könnyebb szűrni a könyvtárakat:

tree -hnNp | sed -r "s@\[d[^[]*\]@@ ; s@\[[^ ]* *([^[]*)\]@\1@"

Az első sed-parancs kitörli azt a részt, amely a könyvtárhoz kapcsolódó infókat írja ki szögletes zárójelben.
A második rész pedig a megmaradt (nyilván nem-könyvtár) infóból csak a méret-információt hagyja meg. Persze a \1 részt szögletes zárójelek közé is lehet rakni, és akkor pont azt fogod kapni, amit kértél.

Szerk.: persze az alapötlet hasonló, mint HZ-é, most látom.

Jó régi ez a szál, de szeretném bővíteni ezt a listázót. Kérdés hogy egyáltalán megoldható-e?

Ez a parancs tökéletes

tree -hNFI '*.srt' | sed -r '/\/$/ s:\[.*\](.*)\/$:\1:'

De szeretném valahogy kiegészíteni némi plusz infóval, amelyet viszont a tree parancs nem tud, csak a mediainfo.

A lekérdezések már megvannak, de gőzöm sincs hogy fűzzem pont oda ahová kéne.

Itt van pld.:
├── Shaolin templom
│   ├── [1.4G] Shaolin templom - 1976.avi
│   ├── [1.4G] Shaolin templom II - 1984.avi
│   └── [700M] Shaolin templom III - 1986.avi

Szeretném valahogy ilyenné kiíratni:

├── Shaolin templom
│   ├── [1.4G] Shaolin templom - 1976.avi (DivX 5, aspect:2.471, dual)
│   ├── [1.4G] Shaolin templom II - 1984.avi
│   └── [700M] Shaolin templom III - 1986.avi

A lekérdezéseket én így tudtam megoldani:

mediainfo Shaolin\ templom\ -\ 1976.avi | awk -vFS=': ' '{print $2}' | grep avi
mediainfo Shaolin\ templom\ -\ 1976.avi | sed -n /Video/,/Audio/p | grep 'Codec ID/Hint' | awk -vFS=': ' '{print $2}'
mediainfo Shaolin\ templom\ -\ 1976.avi | grep aspect | awk -vFS=': ' '{print $2}'
mediainfo Shaolin\ templom\ -\ 1976.avi | sed -n /Audio/,/$/p | grep 'ID' | awk -vFS=': ' '{print $2}'

Bár itt maga a film nem kétnyelvű, de azt majd megoldom hogyha az Audio ID 2, akkor az lesz, ha nem akkor ne is írjon ki semmit.

Picit az az érzésem, fordítva ülsz a lovon. Lehet azt csinálni, hogy tree paranccsal előállítasz valamit, egy másik paranccsal egyéb infót, aztán ezeket nagy nehezen összeilleszted. Ugyanakkor egyszerűbb lenne, ha egyetlen awk vagy bash scripttel előállítanád azt, amit szeretnél.

Teszem azt, végigmész a directory struktúrán, s a fa kinézetet is magad generálod, meg hozzá az infót, a tree-t meg nem használod.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Hallgass a többiekre - amit alább látsz, az csak egy átmenet aközött, amire ők gondolnak és aközött, amire gondoltál.

Jellemzően magyaráznám, hogy mi mit csinál, de - remélem, nincs harag - abból ítélve, hogy a mai napig nyomod a grep | sed | awk... forkbombákat, eddig se nagyon olvastad el, az awk manuálját pedig egyáltalán nem (ami nekem titkos, személyes okból nagyon fáj).


tree -hNFI '*.srt' > /tmp/tree.txt

find .  -iregex '.*\.\(avi\|mkv\|mp4\|mpeg4\|flv\)$'  |
xargs mediainfo '{}' ';' | 
awk -F' +: +'  '
	FILENAME=="/tmp/tree.txt" {
		FS = " *\[ *[0-9][0-9.KMG]?\] +"
		$0 = $0
		print $0, ( $2 in props) ? props[$2] : ""
	} 
	
	/^Complete name/ {
		sub(/.*\//, "", $2); name=$2
	}
	
	/^Video/,/^Codec ID\/Hint$/ {
		if (/^Codec ID\/Hint/) vcodec = $2
	}
	
	/^Display aspect ratio/ {
		aspect = $2
	}
	
	/^Audio/,/^ID/ {
		if (/^ID/) aid = $2
		if ( ! (name in props)) {
			props[ name] = sprintf( "(%s, aspect:%s, %s)", vcodec, aspect, aid)
		}
	}
' - /tmp/tree.txt

Dehogy! Nagyjából úgy koptam ki az aktív C-s életbből, ahogy a nixba belekoptam.

Csak a man magyarítását csináltam hajdan - ráférne egy magyarOSítás is, és az újabb verziókhoz igazítás, mert azóta a függvények megszaporodtak, kicsit általánosabbá téve a nyelvet.
De ahogy elnézem a mai aktivitást, ezt majd talán a fiam fogja reszelni 8-10 év múlva.

Miért lenne harag? De kérdezem ezeket ti mind a manualból tudjátok? Vagy esetleg jártatok olyan iskolába ahol ezt tanultátok? Mert én nem sajnos nem jártam. De igazad van. Nem olvastam el az awk manualjat sohasem az elejétől a végéig. S igazad van gőzöm nincs hogy egy awk-kal ezt mind meglehet oldani. Senki nem mondta eddig! Akkor honnan is kéne tudnom?

Sajnos egyelőre azt a karakterkészletet sem ismerem, amelyek vonalakat, derékszögeket rajzolnak ki. Mert ha kihagyom a tree-t akkor nekem kell ezeket is megoldanom printf-fel vagy echoval, már ha persze szeretném viszontlátni a vonalakat.

Én autodidakta módon tanultam meg eddig is amik rám ragadtak a koszon kívül. De most majd kénytelen leszek megoldani anélkül, hogy a hupra írnék, és mint vizsgafeladatot majd bemutatom.
Csak az a baj, hogyha ezt az utat is választom, senki de senki nem fogja az idejét arra pazarolni, hogy egyáltalán átnézzen egy számára ismeretlentől, egy számára ismeretlen szintaktikával íródott scriptet. S különben is miért nem C++-ban van megírva?

Tehát ezek szerint magad uram ha szolgád nincsen. Persze itt senki nem szolga hiszen azért volt ott a kérés a tárgy mezőben.
S ha nem óhajt segíteni akkor ne tegye.

Az olyan építőjelegű kritikákat meg el kell fogadnom miszerint ne így közelítsd meg. Ez teljesen jogos. Mert én mivel nem ezt tanultam, abból indultam ki amim már megvan. Úgy gondoltam csak kiegészítésre van szükség.
De ezek szerint inkább teljesen új utat kell járnom. oszt jól van.

Rendben van ezt fogom tenni. Mindenesetre köszönöm az eddigi fáradozásokat mindenkitől.

S mielőtt úgy gondolnátok hogy most aztán megsértődtem, vagy átestem a ló túloldalára, közlöm hogy nem. Csak levontam a konzekvenciákat. Mint ahogy a nagy betűs életben, itt is csak magamra számíthatok.
Függetlenül attól hogy mit mondott Picard kapitány a fiatal Wesleynek.

A többiekről nem tudom, hogyan barátkoztak meg vele. Én nem tanultam hivatalosan soha Linuxot, bash-t, awk-t. Viszont régen kezembe akadt egy Héjprogramozás című könyv, s felkeltette annyira a kíváncsiságom, hogy első esetlen lépéseimet megtegyem. Aztán, ha valami nem ment, olvastam manual-t, kerestem neten, próbálgattam, kérdeztem fórumon. Aztán egyre jobban ment.

Mindig lehet mit tanulni, soha sincs vége, de egyre magabiztosabb az ember, s már nem az a kérdés, meg tudom-e oldani, hanem inkább az, hogy hogyan, mennyire szépen.

Nem olvastam el az awk manualt, de mivel nem tudom a függvények paraméterezéseit fejből, ha awk-ban csinálok valamit, egy terminálon ott van a manual is, és olvasgatom.

Szóval kérdezz bátran, de szimpatikus, ha igyekszel magad is megoldásra jutni.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ami engem érint: egyrész fogtam a

man -k '.'

kimenetét, és minden lófüttyöt átolvastam, amit abból érdekesnek találtam.

Másrészt puskáztam az /etc alatti rendszerszkriptekből, és azt is elolvastam, amit ott találtam és nem értettem.

Ami téged érint: meggyőzödésem, hogy rengeteget foglalkozol a dologgal, viszont látom, hogy elengedsz a füled mellett olyan javaslatokat, amelyek arra ösztönöznének, hogy hagyd a sedet picit pihenni (az a vicc, hogy miután mást is átnéztél, a sedet csak még jobban fogod érteni - a korlátait is) - én viszont se locsemege kollégát ismételni, se prédikálni nem szeretnék. (Most azért picit mégis megtettem.)

A segítés más kérdés: azt mindig, legfeljebb a bő lére eresztés marad el, ha éppen nem látom az akceptort.

Tessen elolvasni az O'Reilly-féle sed & awk könyvet, zseniális, és még a sed-et is meg lehet tanulni belőle elég rendesen. Ja, eddig én nem folytam ebbe bele, de azért jelzem én is autodidakta módon tanultam. Mondjuk a papír alapon elérhető manualok ABC-rend szerint végigolvasása (kb 3-4x) nem a legjobb megoldás, de kezdetnek nem rossz akkor sem, ha csak a man 1-et olvasgatja az ember :-)

"Mondjuk a papír alapon elérhető manualok ABC-rend szerint végigolvasása (kb 3-4x) nem a legjobb megoldás"

Úristen, de rosszul fogalmaztam!
Az apropos lista végignyálazása jelentette a térképet, amely alapján sejteni lehetett, mi mivel kb. milyen viszonyban van - a man pedig a zoom volt.

Ennél sokkal többre nem is volt képes a korabeli Forráskód és CHIP mellékletes ízelítő (helyenként el is volt cseszve), de valahol jónak is tartom azt, amikor magamnak kell kivonatolnom a forrásmunkákat: strapásabb, de jobban látszanak a környező jobbkezes utcák.

Valahogy így? :-D

A is for awk, which runs like a snail, and
B is for biff, which reads all your mail.
C is for cc, as hackers recall, while
D is for dd, the command that does all.
E is for emacs, which rebinds your keys, and
F is for fsck, which rebuilds your trees.
G is for grep, a clever detective, while
H is for halt, which may seem defective.
I is for indent, which rarely amuses, and
J is for join, which nobody uses.
K is for kill, which makes you the boss, while
L is for lex, which is missing from DOS.
M is for more, from which less was begot, and
N is for nice, which it really is not.
O is for od, which prints out things nice, while
P is for passwd, which reads in strings twice.
Q is for quota, a Berkeley-type fable, and
R is for ranlib, for sorting ar table.
S is for spell, which attempts to belittle, while
T is for true, which does very little.
U is for uniq, which is used after sort, and
V is for vi, which is hard to abort.
W is for whoami, which tells you your name, while
X is, well, X, of dubious fame.
Y is for yes, which makes an impression, and
Z is for zcat, which handles compression.

Forrás: http://www.aboutlinux.info/2006/12/humor-get-your-abcs-of-linux-right.h…

:-D
Kb igen, csak van/volt ezeken kívül még néhány másik. Eleve az Operátori kézikönyv az awk előtt még ilyen apróságokat tartalmaz a tartalomjegyzék alapján:

intro(1) - ez elég egyértelmű
300, 4014, 450. admin, ar, as, asa

Ebből átlag Linux überhacker jó ha az as-t és az ar-t hallotta, kézzel hívogatni ők se szokták. Valamint azt se szokták tudni, hogy az ``admin'' az a git egyik funkciójának az őse :-) (SCCS)

(Ebben a rendszerben biff még nem volt.)