1
votes

sed avec groupe de capture

J'ai des chaînes comme ci-dessous

VIN_oFDCAN8_8d836e25_Moto__data

Je veux insérer _Moto entre les deux comme ci-dessous

echo VIN_oFDCAN8_8d836e25_In_data | sed 's/_In_*\(_data\)/_Moto_\1/'

Mais quand j'ai utilisé sed avec le groupe de capture comme ci-dessous

VIN_oFDCAN8_8d836e25_In_Moto_data
IPC_FD_1_oFDCAN8_8d836e25_In_Moto_data
BRAKE_FD_2_oFDCAN8_8d836e25_In_Moto_data

J'obtiens la sortie comme:

VIN_oFDCAN8_8d836e25_In_data;
IPC_FD_1_oFDCAN8_8d836e25_In_data
BRAKE_FD_2_oFDCAN8_8d836e25_In_data

Pouvez-vous m'indiquer la bonne direction?


1 commentaires

Quelque chose comme ça peut-il écho VIN_oFDCAN8_8d836e25_In_data | sed 's / _In_data / _In_Moto_data /' fonctionnera pour votre cas?


3 Réponses :


3
votes

Bien que vous puissiez utiliser une simple substitution de la chaîne IN (étant donné qu'elle n'est présente qu'une seule fois dans votre Input_file), mais puisque vous avez spécifiquement demandé la capture du style dans sed , vous pouvez essayer de suivre alors.

sed 's/\(.*_In\)\(.*\)/\1_Moto\2/g'  Input_file

Également ci-dessus ajoutera la chaîne _Moto pour éviter d'ajouter 2 fois _ après Moto confusion, merci à @Bodo d'avoir mentionné la même chose dans les commentaires.

Problème avec la tentative d'OP: puisque vous ne gardez PAS _In_ * en mémoire de sed code> donc il ne prend \ (_ data_ \) que comme première chose en mémoire, c'est la raison pour laquelle il ne fonctionne pas, je l'ai corrigé ci-dessus, nous devons tout garder jusqu'à _IN en mémoire aussi et ensuite il volera.


2 commentaires

Cela vaut peut-être la peine de mentionner un petit problème supplémentaire. Le script modifié ajoute _Moto sans un _ de fin pour éviter les deux _ dans l'exemple de sortie VIN_oFDCAN8_8d836e25_Moto__data


@Bodo, merci de l'avoir fait savoir, ajouté dans ma réponse maintenant.



0
votes

Dans votre cas, vous pouvez directement remplacer la chaîne correspondante par la commande ci-dessous

echo VIN_oFDCAN8_8d836e25_In_data | sed 's / _In_data / _In_Moto_data /'


0 commentaires

1
votes
$ sed 's/_[^_]*$/_Moto&/' file
VIN_oFDCAN8_8d836e25_In_Moto_data
IPC_FD_1_oFDCAN8_8d836e25_In_Moto_data
BRAKE_FD_2_oFDCAN8_8d836e25_In_Moto_data

0 commentaires