Comment supprimer certains préfixes dans chaque mot séparés par un espace ? dont je veux supprimer le préfixe de abc et def du début de la chaîne. J'ai la déclaration sed qui le rend si long. Je ne sais pas si cela peut le rendre plus court et plus simple

Sed: sed -e 's/, /,/g' -e 's/'.yaml$'//g' -e 's/^abc_//g' -e 's/^def_//g' -e 's/,abc_/,/g' -e 's/,def_/,/g'

Input: abc_mscp_def.yaml_v1, def_mscp_abc.yaml_v2, abc_mscp_abc.yaml_v2, def_mscp_def.yaml_v2

Output: mscp_def_v1,mscp_abc_v2,mscp_abc_v2,mscp_def_v2
1
Lazyworm 23 janv. 2020 à 02:13

1 réponse

Meilleure réponse

Vous pouvez utiliser

sed -E 's/(^|,) ?(abc|def)_|(,) |\.yaml/\1\3/g'

Voir la démo en ligne :

s="abc_mscp_def.yaml_v1, def_mscp_abc.yaml_v2, abc_mscp_abc.yaml_v2, def_mscp_def.yaml_v2"
sed -E 's/(^|,) ?(abc|def)_|(,) |\.yaml/\1\3/g' <<< "$s"
# => mscp_def_v1,mscp_abc_v2,mscp_abc_v2,mscp_def_v2

Détails

  • L'option -E active la syntaxe et l'alternance POSIX ERE
  • (^|,) ?(abc|def)_|(,) |\.yaml - correspond :
    • (^|,) ?(abc|def)_ - Groupe 1 : début de chaîne ou virgule, puis un espace facultatif, puis Groupe 2 : soit abc soit def
    • | - ou
    • (,) - Groupe 3 : une virgule, puis un espace
    • | - ou
    • \.yaml - .yaml sous-chaîne.

Le remplacement est \1\3, c'est-à-dire les valeurs des groupes 1 et 3 concaténées.

1
Wiktor Stribiżew 22 janv. 2020 à 23:54