2009-11-26 18 views

Répondre

3

simple remplacement blah:

$ sed -e 's/\[[^]]*_blah]/[Blah]/g' old.sql > new.sql 

Plus générale:

$ perl -pe 's/\[[^]_]+_(.+?)]/[\u$1]/g' old.sql > new.sql 

La raison pour correspondre au préfixe [^]_]+ plutôt que .+ est quantificateurs régulière d'expression sont avides. Par exemple, ce dernier, lorsqu'il reçoit [xx_blah][xx_blah] comme entrée, engloutirait autant que possible et correspondrait à xx_blah][xx, et non à ce que vous vouliez. L'exclusion du support droit et du soulignement est un arrêt de sécurité.

Le \u dans le remplacement est un escape sequence qui majuscules la lettre suivante.

Si vous préférez sed et vos yeux ne se pas croisés de tous les anti-slash, rendez-vous avec

$ sed -e 's/\[[^]_]\+_\(.\+\?\)]/[\u\1]/g' old.sql > new.sql 
+0

aucun de ces Ça a l'air de marcher? pourrait-il être parce que le fichier a été créé sur une machine Windows? (spacing? tabs? newline?) – mrblah

+0

La sortie de 'diff -ub old.sql new.sql' était-elle vide? –

1
sed -e 's/xx_\([a-z]\)/\u\1/' <old.sql> new.sql 
+0

essayé, le fichier n'a pas changé du tout. – mrblah

+0

Eh bien, cela dépend si vous avez réellement voulu dire xx_ – Mez

0

vous pouvez simplement utiliser le shell sans outils externes

#!/bin/bash 
declare -a arr 
while read -r -a arr 
do 
    for((i=0;i<=${#arr};i++))      
    do 
     case "${arr[i]}" in 
      *"[xx_"*);;& 
      *"["*) 
       arr[i]=${arr[i]//xx_/} 
       arr[i]=${arr[i]^^${arr[i]:1:1}} 
     esac 
    done 
    echo ${arr[@]} 
done < "file" 

exemple de la sortie lors de l'exécution

PS1> more file 
this is first line 
this is second line 
[xx_blah] 
this is fourth line 
blah [xx_blah] blah [xx_blah] 
[someText] 
end 

PS1> ./mychanger.sh 
this is first line 
this is second line 
[Blah] 
this is fourth line 
blah [Blah] blah [Blah] 
[SomeText] 
end