Vinnaren i pepparkakshustävlingen!
2011-04-26, 18:37
  #1
Medlem
Clint.Eastwoods avatar
Tjena,

Finns det nått bra sätt att greppa allt mellan två strängar?

till exempel!

Kod:
var = abcdefabcdefabcdefabcdefabcdef

Om jag vill greppa allt mellan "ab" och "ef", alltså få tag i "cd". Hur skulle ni göra?
Citera
2011-04-26, 18:49
  #2
Moderator
vhes avatar
Jag skulle inte använda grep (eller bash).

Kod:
> echo abcdefabcdefabcdefabcdefabcdef | awk 'BEGIN { FS="(ab|ef)" } { print $2 }'
cd

Det finns säkert andra sätt, men jag skulle inte orka tänka ut dem.
Citera
2011-04-26, 23:09
  #3
Medlem
Clint.Eastwoods avatar
Citat:
Ursprungligen postat av vhe
Jag skulle inte använda grep (eller bash).

Kod:
> echo abcdefabcdefabcdefabcdefabcdef | awk 'BEGIN { FS="(ab|ef)" } { print $2 }'
cd

Det finns säkert andra sätt, men jag skulle inte orka tänka ut dem.

Se där ja!

dock ville jag ha ut alla "cd" om man säger så, any ideas?
__________________
Senast redigerad av Clint.Eastwood 2011-04-26 kl. 23:13.
Citera
2011-04-27, 10:44
  #4
Medlem
Doodles avatar
Regular expression kan ju vara en lösning

Följande exempel är i Perl:

Kod:
$var "abcdefabcdefabcdefabcdefabcdef";

while(
$var =~ s/(cd)/0/){
    print $
1"\n";


Regexen letar efter "cd" när den hittar byter den ut cd mot en nolla så det inte matchas igen. Sedan kör den igenom strängen tills den inte hittar några fler förekomster av "cd".
Citera
2011-04-27, 19:02
  #5
Medlem
Clint.Eastwoods avatar
Citat:
Ursprungligen postat av Doodle
Regular expression kan ju vara en lösning

Följande exempel är i Perl:

Kod:
$var "abcdefabcdefabcdefabcdefabcdef";

while(
$var =~ s/(cd)/0/){
    print $
1"\n";


Regexen letar efter "cd" när den hittar byter den ut cd mot en nolla så det inte matchas igen. Sedan kör den igenom strängen tills den inte hittar några fler förekomster av "cd".

Tanken var inte att jag ville leta efter "cd" utan jag ville ha allt som står mellan ab och ef.

Kod:
var ="ab11ef ab12efabASDFef"

Alltså från den variabeln vill jag få tag i 11 12 och ASDF, förstår du?
Citera
2011-05-07, 12:53
  #6
Medlem
Citat:
Ursprungligen postat av Clint.Eastwood
Om jag vill greppa allt mellan "ab" och "ef", alltså få tag i "cd". Hur skulle ni göra?

Kod:
$ var=abcd1efabcd2efabcd3efabcd4efabcd5ef
$ echo $var | sed -e 's/ab//g;s/ef/ /g'
cd1 cd2 cd3 cd4 cd5 

Vill du sen iterera över allt du fått tag på kapslar du med fördel in det i en for-loop:

Kod:
$ var=abcd1efabcd2efabcd3efabcd4efabcd5ef
$ for x in $(echo $var | sed -e 's/ab//g;s/ef/ /g') ; do echo $x ; done
cd1
cd2
cd3
cd4
cd5
Citera
2011-06-15, 20:13
  #7
Medlem
kqrs avatar
Mer perlmagi inuti bash:
$ echo "abcdefabcdefabcdefabcdefabcdef" | perl -pe 's/ab(.*?)ef/\1/g'
cdcdcdcdcd


$ echo "ab11ef ab12efabASDFef" | perl -pe 's/ab(.*?)ef/\1/g'
11 12ASDF
__________________
Senast redigerad av kqr 2011-06-15 kl. 20:16.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback