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?
3 Réponses :
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.
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.
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 /'
$ 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
Quelque chose comme ça
peut-il écho VIN_oFDCAN8_8d836e25_In_data | sed 's / _In_data / _In_Moto_data /'fonctionnera pour votre cas?