2017-06-19 4 views
1

J'ai la chaîne suivante et je veux remplacer (supprimer) le deuxième mot qui apparaît dans la chaîne (SECONDWORD). La ligne suivante ne change rien et imprime simplement la même chaîne. Cependant, lorsque je supprime la partie '123' de la chaîne, la ligne semble fonctionner.La commande sed dans shell ne remplacera pas la deuxième correspondance d'un modèle

echo "WORD 123 SECONDWORD THIRDWORD" | sed 's/ *[A-Z]* *//2' 

Je ne vois pas le problème.

+0

Voir: [The Stack Overflow expressions régulières FAQ] (http://stackoverflow.com/a/22944075/3776858) – Cyrus

Répondre

0

Essayez ceci: sed -r 's/\b[A-Z]+ *//2

Le *, qui correspond à zéro occurences, est la question.

Vous pouvez le voir en jouant avec le numéro de fin. Lorsque vous avez des chaînes séparées par des espaces qui ne correspondent pas [A-Z], vous obtenez des correspondances sur des chaînes vides qui délimitent des chaînes sans correspondance.

 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//1' 
    123 SECONDWORD THIRDWORD FOURTHWORD 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//2' 
    WORD 123 SECONDWORD THIRDWORD FOURTHWORD 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//3' 
    WORD 123 SECONDWORD THIRDWORD FOURTHWORD 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//4' 
    WORD 123THIRDWORD FOURTHWORD 
    [~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]* *//5' 
    WORD 123 SECONDWORD FOURTHWORD 

... alors lorsque vous avez 123, vous voulez réellement supprimer le 4ème élément correspondant. Où 'WORD ', null, null,' SECONDWORD ','THIRDWORD ' correspondent des modèles 1-5. Il correspond à deux chaînes vides autour des limites de 123.

Vous pouvez résoudre ce problème en utilisant + et non * avec sed -r:

[~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed -r 's/ *[A-Z]+ *//2' 
WORD 123THIRDWORD FOURTHWORD 

Ou utilisez la syntaxe plus laid \{1,\} sans -r:

[~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed 's/ *[A-Z]\{1,\} *//2' 
WORD 123THIRDWORD FOURTHWORD 

Mais qui mangé un espace que vous n » t veulent mangé, ainsi utilisé le marqueur de limite de mot \b:

[~/tmp] > echo 'WORD 123 SECONDWORD THIRDWORD FOURTHWORD' | sed -r 's/\b[A-Z]+ *//2' 
WORD 123 THIRDWORD FOURTHWORD 
-1

Cela pourrait fonctionner pour vous (GNU sed):

sed 's/\S\+\s*//2' file 

Retirez la deuxième occurrence d'un ou plusieurs espaces non suivis par zéro ou plusieurs espaces.

Peut également être écrit:

sed 's/\S\S*\s*//2' file