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
Voir: [The Stack Overflow expressions régulières FAQ] (http://stackoverflow.com/a/22944075/3776858) – Cyrus