sed kezdő

Hozzászólások

Nekem is lenne egy kis kellene egy kis bash script sed segitsegevel, amit mar nagyabol megoldotam, es jol is mukodik, egy eset kivetelevel!

A megoldando problema a kovetkezo:
Van egy fajl, aminek a tartalma igy nez ki:

szoveg : szoveg
szoveg : szoveg
szoveg : szoveg

Ezt be kell olvasni es atalakitani ugy hogy igy nezzen ki:

[szoveg][szoveg]
[szoveg][szoveg]
[szoveg][szoveg]

Meg is oldottam ezzel a paranccsal:

cat /home/blint/szoveg | tr -d $' ' | sed 's,\(.*\):\(.*\),[\1][\2],'

Ez kiveszi a spaceeket es szetvalasztja a : -nal.

Csak a problema az, hogy ha tobb olyan sor van, hogy:

szoveg : szoveg : szoveg

Ekkor a masodik : -nal valasztja szet es nem az elsonel, pedig en azt szeretnem hogy mindegy hogy hany kettospont van a sorba, az elsonel valassza kette es ugy tegye []-be a ket reszt.

Tud erre valaki megoldast?

Koszonom roach remekul mukodik.
Azomban lenne meg valami amire nem jovok ra.

sed -n '/elso sor/,/huszadik sor/ P'

Ez ugye kiirja az elso sort es a huszadik sort, meg ami meg koztuk van. Csak azt nem tudom megadni sehogy, hogy az elso sort es a huszadik sort ne irja ki. Csak az kellene ami a ketto kozott van.

szerk: hopp meggse csak elso oldalt olvastam :)

[quote:56cdc11fc1="szaszg"]...

- Bash macskaköröm vs. aposztróf:
Igazad is van, meg nem is, mert a fenti zárójeleknél tényleg nincs különbség, viszont van, ahol igen:
[code:1:56cdc11fc1]
fules@chaos:/tmp/q$ echo "a!"
bash: !": event not found
fules@chaos:/tmp/q$ echo 'a!'
a!
fules@chaos:/tmp/q$ echo "$BASH_VERSION"
2.05b.0(1)-release
fules@chaos:/tmp/q$ echo '$BASH_VERSION'
$BASH_VERSION
[/code:1:56cdc11fc1]
- A sed-en belüli escape-elés: pontosan, ahogy mondtad, a '[]'-et escape-elni kell, mert a regexp-ben jelentése van, annyit azért hozzátennék, hogy a '{}'-nek és a '()'-nek extended regexp esetén szintén, mert ott ezek ugyanazt jelentik, mint a simában ki-escape-elve (ismétlődésszám ill. csoportosítás):
[code:1:56cdc11fc1]
fules@chaos:~$ echo "abbbabbab" | sed 's/b{2,3}/Q/g'
abbbabbab
fules@chaos:~$ echo "abbbabbab" | sed -r 's/b{2,3}/Q/g'
aQaQab
fules@chaos:~$ echo "aaqweraa" | sed 's/aa(.*)aa/\1 \1/g'
sed: -e expression #1, char 18: invalid reference \1 on `s' command's RHS
fules@chaos:~$ echo "aaqweraa" | sed -r 's/aa(.*)aa/\1 \1/g'
qwer qwer
[/code:1:56cdc11fc1]
- sed y parancsa, tr: mivel annak regexp-hez nem sok köze van, természetesen nem kell escape-elni, márminthogy a sed ill. tr elől nem, mert a shell mint láthattuk, belekavarhat:
[code:1:56cdc11fc1]
fules@chaos:~$ echo 'asdfasd!aaaa' | tr "!" "Q"
bash: !: event not found
fules@chaos:~$ echo 'asdfasd!aaaa' | tr '!' 'Q'
asdfasdQaaaa
[/code:1:56cdc11fc1]
- "Mit honnan vett a perl?"
A perl 1.0 1987-ben jött ki. http://history.perl.org/PerlTimeline.html
A csh kb. 1979-ben. http://en.wikipedia.org/wiki/Unix_shell
Az 'aposztróffal határolt string literális, a macskakörmösben helyettesítgetünk" viselkedés mind a csh-ra, mind a perl-re jellemző. Szerintem már a perl írásakor is logikus volt, hogy jobb egy már bevett jelölésmódot átvenni, mint újat kitalálni rá. De végülis Larry Wall is csak kb. 8 éve használta ezt a szintakszist a shell-scriptjeiben, szóval tényleg nem biztos, hogy a shell-ekből lett átvéve :)...
- rtfm
A billentyűzethez kapcsolódó elfoglaltságok közül a kedvencem! Három nap manpage-ek nélkül, és minden olyan sivárnak tűnik :) !

Ja, amúgy a portál bizonyos szavakat szűr, azaz pl. "a-p-o-s-z-t-r-ó-f-o-s" => "aposztrófos", na ezért kellett körülírnom :)

Az lenne a szitu, hogy beadandó miatt nem oldhatom meg a stuffot perlben csak bashban és ott használhatok sed-et meg awk-t. Ehhez a feladathoz most pont a sedre van szükségem. Ha valaki tud egy jó bash-al foglalkozó web-oldalt azt megköszönném, és a probléma maga:
szóval azt szeretném a sed-el megcsináltatni, hogy több karaktert, pl: " x f { } <> []" meg ilyenek vlmi ilyesmire cseréljen le "X F }{ ><][". na ezzel az a bajom, hogy valahogy ott elakadok amikor több karaktert akarok kicserélni. persze a több karakter nem stringként értendő, hanem külön külön akarom az előfordulásokat kicserélni.
A válaszokat előre is köszönöm, ja és lécci NAGYON SÜRGŐS lenne

Ha meg sed (de inkább tr, tényleg), akkor:
[code:1:22d0500816]sed -e 's/x/X/g' \
-e 's/f/F/g' \
-e ...
[/code:1:22d0500816]
Innét már kitalálható. Némelyik zárójelet escape-elni kell.
HTH

eddig el is jutottam sed-el, de az a gond, hogyha a }-t {-re cserélném
vagy a pipe miatt vissza cserélődne az is ami nem kéne, vagy syntax error, szóval az kéne, hogyan tudok neki itt listát megadni pl:
sed 's/listamit/listamire/g' <inputfile

[quote:5e6272789a="bzsoltika"]Ha meg sed (de inkább tr, tényleg), akkor:
[code:1:5e6272789a]sed -e 's/x/X/g' \
-e 's/f/F/g' \
-e ...
[/code:1:5e6272789a]
Innét már kitalálható. Némelyik zárójelet escape-elni kell.
HTH

sed 's/x/X/g;s/f/F/g'

de az eloadas.htm-ben benne van. A kérdés az első beadandóra emlékeztet...

[quote:07799cfbb3="neilus"]eddig el is jutottam sed-el, de az a gond, hogyha a }-t {-re cserélném
vagy a pipe miatt vissza cserélődne az is ami nem kéne, vagy syntax error, szóval az kéne, hogyan tudok neki itt listát megadni pl:
sed 's/listamit/listamire/g' <inputfile

Ez a tr...

azaz, csak kómás kialvatlan anti bash-sed-awk hangulatban perl-python-c rulez!

hali panther, most nézem ki is vagy te :)
segícc lécci, legalább egy fasza howto-ra mutass rea, mer' ez a CsA jegyzet nagyon száraz, és én ezt az erőltetett bashozást nagyon utálom

[quote:f0fd3a708c="neilus"]hali panther, most nézem ki is vagy te :)
segícc lécci, legalább egy *** howto-ra mutass rea, mer' ez a CsA jegyzet nagyon száraz, és én ezt az erőltetett bashozást nagyon utálom

No ja. A gond ott van, hogy nem nagyon olvasgatok ilyeneket - s ezért nem is tudok linket ajánlani. Egyébként itt bal oldalt valahol találsz letölthető doksikat, pl bash-hoz. Ezzel kifújt minden tudásom. Valamennyi doksit stb magam is kreáltam, de nem eresztettem el magam => http://panther.web.elte.hu/

de Llama voltam! a CsA jegyzetben nehezen égőszemmel, de megtaláltam a választ, most fogom tesztelni: vlmi ilyesmi:
sed 's/[a sok karakter]/a sok karakter/g' <input
csak most az merül fel bennem, hogy az azonos indexű karaktereket párosítja-e, mert nekem az kéne?

thnx panther már olvasgatom! óó a nyelvi lab mily csodás égő szemmel ezekben az órákban!

[quote:e07b32b05f="neilus"]de Llama voltam! a CsA jegyzetben nehezen égőszemmel, de megtaláltam a választ, most fogom tesztelni: vlmi ilyesmi:
sed 's/[a sok karakter]/a sok karakter/g' <input
csak most az merül fel bennem, hogy az azonos indexű karaktereket párosítja-e, mert nekem az kéne?

hát asszem figyelmetlen voltál.

echo abecfd | sed 's/[abcd]/abcd/g' # eredmény: abcdabcdeabcdfabcd

az abcd karakterek bármelyikét lecseréli a _teljes_ helyettesítő karaktersorozatra. (neked a tr kell).

nem értem ezt az infót, hogyan kéne a translate-el csinálni?
lehet, hogy csak azért, mert mostanában nem alszok, hanem matekozok?

most meg az a bajom, hogy a
[code:1:6dd836627d]
tr "\{ \} \( \)" "\} \{ \) \(" <inputfile
[/code:1:6dd836627d]
[code:1:6dd836627d]
tr "\{ \} \( \)" "\} \{ \) \(" <1
[/code:1:6dd836627d]már káosz, nincs output sőt, ha megspékelem egy ilyennel
[code:1:6dd836627d]
cat inputfile|tr " " ""|tr "\{ \} \( \)" "\} \{ \) \("
[/code:1:6dd836627d]
már error meg minden
szóval elegem van a bash-ból egy életre!

[code:1:544015d629]
fules@rasta:~$ echo 'int main(int argc, char* argv[]) { while (1) do { fork(); }}' | tr '{}()[]<>' '}{)(][><'
int main)int argc, char* argv][( } while )1( do } fork)(; {{
[/code:1:544015d629]
Használj aposztrófokat macskaköröm helyett, és nem kell annyit escape-elgetni. (A perl is innen vette :)...)

[quote:7d109d04f5="neilus"]most meg az a bajom, hogy a
[code:1:7d109d04f5]
tr "\{ \} \( \)" "\} \{ \) \(" <inputfile
[/code:1:7d109d04f5]
[code:1:7d109d04f5]
tr "\{ \} \( \)" "\} \{ \) \(" <1
[/code:1:7d109d04f5]már káosz, nincs output sőt, ha megspékelem egy ilyennel
[code:1:7d109d04f5]
cat inputfile|tr " " ""|tr "\{ \} \( \)" "\} \{ \) \("
[/code:1:7d109d04f5]
már error meg minden
szóval elegem van a bash-ból egy életre!

Bocs de szimplan hulye vagy...
1. info sed, ott olvashatod pl..
sed 'y/{}[]<>lof_asz/}{][><LOF ASZ/'
2. tr-ben mi a szart escape-lsz????
tr '[]{}<>' '][}{><'

Zsiraf

p.s.: RTFM

[quote:aa466fa5a6="gsimon"][code:1:aa466fa5a6]
fules@rasta:~$ echo 'int main(int argc, char* argv[]) { while (1) do { fork(); }}' | tr '{}()[]<>' '}{)(][><'
int main)int argc, char* argv][( } while )1( do } fork)(; {{
[/code:1:aa466fa5a6]
Használj aposztrófokat macskaköröm helyett, és nem kell annyit escape-elgetni. (A perl is innen vette :)...)

Mi vaaaaan???????
Az aposztrof es a macskakorom kozott escape tekinteteben a bash-ban nincs
szamottevo kulombseg, tehat a fenti peldadban is teljes nyugalommal hasznalhatod a
macskakormoket... A sed regexp-jeben nem a bash elol kell esc-elni, hanem a sed elol,
mivel ott a [] specialis jel... (ja, a {} <> NEM kell esc-elni...:-)) persze a sed y parancsanak
nem specialis jel a [], tehat azt ott NEM kell esc-elni...

Zsiraf

p.s.: RTFM

p.s2: mit vett honnet a perl?????
1. perl a szimpla aposztrof eseten nem vegzi el a behelyettesiteseket, csak egy escape van, az esc-aposztrof, mig a macskakorom eseten igen...
2. bash, se az aposztrof se a macskakorom eseten nincsenek esc-ek, csak a macskakorom eseten az esc-macskakorom, a valtozobehelyettesites a macskakorom eseten mukodik.
3. a bash-nal letezik a $'' "parancs" ami az aposztrofok kozott levo sztringben nezi az esc-eket... (pl. tab, ujsor, esatobbi)
4. RTFM
5. RTFM
6. RTFM
7. Mit vett honnet a perl???

kicsiny kérdésem:
van a szöveges állományomban egyes sorok végén egy vessző és egy space, majd új sor.
ezt a három cuccot szeretném cserélni egyetlen vesszőre és space-re.
Másképpen fogalmazva: azokat a sorokat, melyek vesszővel végződnek, össze akarom fűzni az alatta levő sorral.

ezzel próbálkoztam, de nem megy, hiába ütöm:
cat file.txt | sed 's/, \n/, /g'

köszönet minden segítségért...

Hi!

Egy kis segítséget megköszönnék.

kl223@freelancer ~ $ echo "1#2###3" | sed "s/##/#akarmi#/g"
1#2#akarmi##3
kl223@freelancer ~ $

Arra lenne szükségem, hogy mindkét helyen kicserélje a sed, tehát ezt kapjam:
1#2#akarmi#akarmi#3

Van rá megoldás?

Kösz,
kl223

Nem figyeltel. Mind a 2 sed csereben benne van a /g - azaz gyonyoruen mukodik. Ugyanis az elso lecserel minden 2 egymast koveto #-et, mig a masodik csere lecsereli (az osszeset), ahol a csere utan lesz 2 db #.


$ echo "1#2#########3" | sed "s/##/#akarmi#/g;s/##/#akarmi#/g"
1#2#akarmi#akarmi#akarmi#akarmi#akarmi#akarmi#akarmi#akarmi#3
$ 

Nálam hasonló lenne mint az utóbbi. vannak fájljaim és szeretnék aposzrofok közötti karakterek kivételével mident kiszedni (nem rekurziv! nyitó után rögtön záró aposztrof jön), ez müködik is az első illeszkedésig. Elvégzi minden beolvasot sornak az első illeszkedéséig, de mivan ha több van mint 1 ha pl ilyeneim vannak egy sorban:
"1" alma "2" dio "3" fa
rendszerint ez kapom:
"1""2" dio "3" fa
Szoval csak az első illeszkedésik müködik, mit kell tennem h addig futtasa le a sort ameddig az ÖSZSES illeszkedés elnem fogyot a fájlban/sorban?

Hello!

Most lenne egy olyan kérdésem hogy hogyan lehet nagybetűket kisbetűkre cserélni és az ékezeteseket ékezetlenre. Mert "~" h mindegy karakter azonos kis és nagybetű nekem nem müködik meg regkifben a|b jelentése sem... pedig regkif... és hogy lehet hogy * minden karaktert kezel tehát "helyetesit" és még sem mert az ékezetesekeket bent hagyja... Biztos van rá vmi egyszerű megoldás, mert mikor csináltam egy kicserélő progit...
sed 's/vmit/vmire/g' (egyenként a betüket)
szerintem mondanom se kell hogy egy nagyonn fájlal nem csinált semmit...
érdekes nyelv ez a unix ^^

Probald meg sed helyett a tr paranccsal lecserelni a betuket.
* nem mindenre illeszkedik, hanem az elotte allo kifejezest ismetli (vagy elhagyja, ha 0-szor kellene ismetelni)

ui: probaltam annyira zavarosan fogalmazni, hogy meg te is megertsd, de nem biztos, h sikerult

----
Sooner or later you had to talk, even if it was only because you'd run out of things to throw. - Pratchett
honlap készítés

Sziasztok!

Tud valaki valamilyen trukkot, arra, hogy hogy lehet kiszedni a dhcpd.conf-bol egy csv-be a kovetkezo adatokat :
hostname;MAC;IP

Eddig jutottam:

cat /etc/dhcpd.conf| egrep -o "([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}|([0-9]{1,3}\.){3}[0-9]{1,3} " | egrep -v '255' | sed -e '1,5d' | sed 'n;G;'| tr '\n' ';' | sed 's/;;/\n/g'

a dhcpd.conf fajlrol van szo. Azt szeretnem, hogy csv fajl legyen belole, amit aztan excel-be tudjam importalni.

Igy sikerult meg tuningolni az elozon:

cat /etc/dhcpd.conf| sed '/^\#/d' |egrep -o "([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}|([0-9]{1,3}\.){3}[0-9]{1,3}| host.* {"| sed 's/ host //'| sed 's/ {//' |egrep -v "11.255" |sed -e '1,10d' | sed 'n;n;G;'| tr '\n' ';' | sed 's/;;/\n/g'| tr ';' ';'

Ha van valakinek konstruktiv javaslata szivesen meghallgatom!!

A kerdesedre a valasz, ime egy reszlet a fajlbol:

subnet 192.168.11.0 netmask 255.255.255.0 {
option routers 192.168.11.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.11.255;
}

#X szoba
host X {
fixed-address 192.168.11.200;
hardware ethernet 00:40:8F:EC:00:D7 ;
}

Sziasztok,

Tudnátok segíteni egy olyan scriptben, ami azt csinálja, hogy azokat a fájlokat, amiket előzőleg youtube-dl lel letöltöttem időrendi sorrendben kilistázza, és a fájlnévbe eléjük tesz sorszámot így:

01_file.mp4
02_file.mp4
03_file.mp4

Még annyi szépséghiba van a dologban, hogy a script letörölhetné a fálj nevekbél a "-SVVSCCSAVvXX" részt is.
Magamtól eddig jutottam el, ami nem sok:

ls -t | awk -F "-" '{print $1}'

de ez vissza kellene írni a .mp4 -et és az elejére pedig a sorszámokat:-(

Készítettem egy képernyöképet a fájlokról:
http://kepfeltoltes.hu/view/140718/Screenshot_-_07182014_-_09_12_56_AM_…

while ciklusba kellene szerintem tenni a parancsokat valahogy így ugye?

while

n=1
while (( $n <= `ls | wc -l` ))
do
echo "Hello"
n=$(( n+1 ))
done

Köszi előre is.

-- Zoli ---

Lenovo T400 @ Crunchbang "Waldorf"

#!/bin/sh

IFS='
'

for f in `ls -t | cat -n`; do
    number=`echo ${f} | sed "s@^[[:space:]]*\([0-9]*\).*@\1@"`
    file=`echo ${f} | sed "s@^[[:space:]]*[0-9]*[[:space:]]*\([^\ ].*\)@\1@"`
    newfile=`echo ${file} | sed "s@^\(.*\)-[^-]*.mp4@\1.mp4@"`
    mv "${file}" `printf "%03d_%s" ${number} ${newfile}`
done

Ha a youtube-ról származó azonosítót már törölted, akkor a newfile=... sor nem kell (ha bennemarad, akkor sincs gond), és az mv "${file}"... sorban a ${newfile} helyett ${file}-t írj.

Garanciát nem vállalok, ezért javaslom, hogy az mv elé írj egy echo parancsot, hogy lásd, jó lesz-e az átnevezés.

A dokumentációban találtam ezt a megoldást, ami a fájl végérol letörli az azonosítót, így részben már megoldódott a probléma:

youtube-dl -i URL -o "%(title)s.%(ext)s"

-- Zoli ---

Lenovo T400 @ Crunchbang "Waldorf"