与捕获组一起

时间:2019-05-02 09:44:11

标签: shell sed

我有类似下面的字符串

VIN_oFDCAN8_8d836e25_In_data;
IPC_FD_1_oFDCAN8_8d836e25_In_data
BRAKE_FD_2_oFDCAN8_8d836e25_In_data

我想在两者之间插入_Moto

VIN_oFDCAN8_8d836e25_In_Moto_data
IPC_FD_1_oFDCAN8_8d836e25_In_Moto_data
BRAKE_FD_2_oFDCAN8_8d836e25_In_Moto_data

但是当我将sed用于以下捕获组时

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

我得到的输出为:

VIN_oFDCAN8_8d836e25_Moto__data

您能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

尽管您可以使用IN字符串的简单替换(考虑到它在Input_file中仅出现1次),但是由于您专门要求捕获sed中的样式,因此您可以尝试遵循

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

上述方法还将添加字符串_Moto,以避免在_混乱之后添加两次Moto,这要感谢@Bodo在评论中提及相同的内容。

OP的尝试问题:由于您没有将_In_*留在sed的内存中,因此它只是将\(_data_\)留在内存中,这就是它不起作用的原因,我已经在上面对其进行了修复,我们还需要将所有内容都保留到_IN中,然后它才能飞行。

答案 1 :(得分:1)

您可以使用以下命令直接替换匹配的字符串

MyShaderUniforms

答案 2 :(得分:0)

$ 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