Toon posts:

hoe variabelen gebruiken in sed

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste mensen,

Even een vraagje: ik zit me hier te prutsen op een linux machine met sed. Ik wil het volgende:

Ik wil de output van een ls -l veranderen door voor elke regel de inhoud van een gezette varaiabele te tonen. Ik gebruik het volgende stukkie code:

code:
1
2
3
var=testvar

ls -l | sed '/^-/s/^/$var /'


de output die wordt gegenereerd:

code:
1
2
3
$var -rwxrwxr-x   1 userna   users          42 Jul 16 16:20 prog
$var -rw-rw-r--   1 userna   users           0 Jul 16 16:20 testfile1
$var -rw-rw-r--   1 userna   users           0 Jul 16 16:20 testfile2


Hoe krijg ik nou de inhoud van de variabele in de output van sed? heb de search al geprobeerd maar kom helaas niet tot een oplossing.

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Bij mij werkt het als ik die quotes weghaal
dus
code:
1
ls -l | sed /^-/s/^/$var/


en ook de spatie tussen $var en de slash mag (moet ? ) weg

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


Verwijderd

Topicstarter
u_nix_we_all schreef op 16 juli 2004 @ 16:32:
Bij mij werkt het als ik die quotes weghaal
dus
code:
1
ls -l | sed /^-/s/^/$var/


en ook de spatie tussen $var en de slash mag (moet ? ) weg
Als ik dit probeer (dus zonder de quotes) dan krijg ik de volgende output:

code:
1
sed: -e expression #1, char 15: Unterminated `s' command

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Ja, die spatie MOET daar weg :Y)

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


  • ErrieR
  • Registratie: Maart 2003
  • Laatst online: 01-02 14:52
Gebruik i.p.v. single quotes, double quotes. Dan werkt het, omdat de shell varibale substitutie doet op dubbele quotes.

ls -l | sed "/^-/s/^/$var /"

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
ErrieR schreef op 16 juli 2004 @ 16:41:
Gebruik i.p.v. single quotes, double quotes. Dan werkt het, omdat de shell varibale substitutie doet op dubbele quotes.

ls -l | sed "/^-/s/^/$var /"
Neeeheee , die spatie moet daar weg, kan best zonder quotes :X
[edit]
Oh , wacht ff, de spatie wil je erbij hebben..... dan moet je idd
dubbele quotes gebruiken....... sorry.....

[ Voor 18% gewijzigd door u_nix_we_all op 16-07-2004 16:45 ]

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


Verwijderd

Topicstarter
u_nix_we_all schreef op 16 juli 2004 @ 16:43:
[...]


Neeeheee , die spatie moet daar weg, kan best zonder quotes :X
Jajajajaja ;) , werkt wel met dubbele quotes:

code:
1
2
3
testvar -rwxrwxr-x   1 naam   users          42 Jul 16 16:44 prog
testvar -rw-rw-r--   1 naam   users           0 Jul 16 16:20 testfile1
testvar -rw-rw-r--   1 naam   users           0 Jul 16 16:20 testfile2

[ Voor 3% gewijzigd door Verwijderd op 16-07-2004 16:52 ]


Verwijderd

Topicstarter
Ben nog even wat aan het ouzeelen met sed en ik probeer het volgende te doen:

Ik heb een file die ik cat en de output hiervan geef ik door aan het sed commando. Nu wil ik dat als een regel met een bepaald karakter begint (bv [a-z]) , dat dan de regel wordt opgenomen in een variabele en dat ik deze variabale hiernaa kan gebruiken tbv substitutie op bv de volgende regel.

heb dus bv deze file die ik cat:

Dit is een regel die begint met een letter
00-deze regel begint met een cijfer
01-deze regel ook
02-deze regel ook tralalalala

De regel "Dit is een regel die begint met een letter" moet dus in een variabele zodat en dan moet sed verder met de volgende regel waarmee ik bv dan dit kan doen :

code:
1
sed "/^[0-9]/s/^/$variabele_die_zojuist_is_gevuld_met_de_inhoud_van_regel/"


Mijn vraag is nu dus concreet, hoe boks ik het voor elkaar dat de regel die begint met een letter in de variabele wordt gestopt?

Verwijderd

ff wat tips en een perl plug ;)...
man sed , die is redelijk "duh"
man 7 regexp , voor de reguliere expressies
en de SED faq

en als je wat ingewikkelders wil doen is een perl script ook een goed alternatief, omdat je dan minder ruzie hebt met de shell-quoting en perl juist z'n sterke kant in reguliere expressies heeft (zie perl-functies 's/ / /', 'm/ /', 'grep' en consorten) ff een voorbeeldje
Perl:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
while (<STDIN>) { # lees van de standard in regel voor regel
 $line =$_; # ff perl's standaard variable aan een gewone var toewijzen, 
                  # dan wordt het wat minder cryptisch
  if ( $line =~  m/match expressie/ ) 
  {
     $out = $line;
     $out =~ s/zoek/vervangdoor/ ;
     print $out; 
 }
}

Verwijderd

Topicstarter
Verwijderd schreef op 17 juli 2004 @ 15:02:
ff wat tips en een perl plug ;)...
man sed , die is redelijk "duh"
man 7 regexp , voor de reguliere expressies
en de SED faq

en als je wat ingewikkelders wil doen is een perl script ook een goed alternatief, omdat je dan minder ruzie hebt met de shell-quoting en perl juist z'n sterke kant in reguliere expressies heeft (zie perl-functies 's/ / /', 'm/ /', 'grep' en consorten) ff een voorbeeldje
Perl:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
while (<STDIN>) { # lees van de standard in regel voor regel
 $line =$_; # ff perl's standaard variable aan een gewone var toewijzen, 
                  # dan wordt het wat minder cryptisch
  if ( $line =~  m/match expressie/ ) 
  {
     $out = $line;
     $out =~ s/zoek/vervangdoor/ ;
     print $out; 
 }
}
Bedanktvoor je reactie, ik heb alleen helemaal geen verstand van perl, het zal echt met een sed scriptje moeten. In kan in de manual niet echt een voorbeeld vinden waarbij een regel in een variabele wordt gestopt overigens. Misschien iemand die dit al eens heeft gedaan?
Pagina: 1