使用sed命令捕获组

使用sed命令捕获组,sed,Sed,我有下面这样的字符串 _c_VehCfg1_oCAN00_f276589c_In_Int_buf *pVehCfg1_oCAN00_f276589c_In_IntBuf = (_c_VehCfg1_oCAN00_f276589c_In_Int_buf *)can_Msg_tmp_buffer; 我想用ptr替换can\u Msg\u tmp\u buffer,如下所示 _c_VehCfg1_oCAN00_f276589c_In_Int_buf *pVehCfg1_oCAN00_f2765

我有下面这样的字符串

 _c_VehCfg1_oCAN00_f276589c_In_Int_buf *pVehCfg1_oCAN00_f276589c_In_IntBuf = (_c_VehCfg1_oCAN00_f276589c_In_Int_buf *)can_Msg_tmp_buffer;  
我想用
ptr
替换
can\u Msg\u tmp\u buffer
,如下所示

_c_VehCfg1_oCAN00_f276589c_In_Int_buf *pVehCfg1_oCAN00_f276589c_In_IntBuf = (_c_VehCfg1_oCAN00_f276589c_In_Int_buf *)ptr;
echo  "_c_VehCfg1_oCAN00_f276589c_In_Int_buf *pVehCfg1_oCAN00_f276589c_In_IntBuf = (_c_VehCfg1_oCAN00_f276589c_In_Int_buf *)can_Msg_tmp_buffer;" | sed  's/\(_C_[[:alnum:]_]*IntBuf = [[:alnum:]_]*\)can_Msg_tmp_buffer/1\ptr/g'
我已经尝试了
sed
如下

_c_VehCfg1_oCAN00_f276589c_In_Int_buf *pVehCfg1_oCAN00_f276589c_In_IntBuf = (_c_VehCfg1_oCAN00_f276589c_In_Int_buf *)ptr;
echo  "_c_VehCfg1_oCAN00_f276589c_In_Int_buf *pVehCfg1_oCAN00_f276589c_In_IntBuf = (_c_VehCfg1_oCAN00_f276589c_In_Int_buf *)can_Msg_tmp_buffer;" | sed  's/\(_C_[[:alnum:]_]*IntBuf = [[:alnum:]_]*\)can_Msg_tmp_buffer/1\ptr/g'
但我仍然没有得到预期的结果,相反,
sed
输出与输入相同

问题是我也有下面这样的字符串

_c_GW_C4_oCAN00_f276589c_In_Moto_buf *pGW_C4_oCAN00_f276589c_In_MotoBuf = (_c_GW_C4_oCAN00_f276589c_In_Moto_buf *)can_Msg_tmp_buffer;

我只想替换
类型
\u Int\u buf
而不是
\u Moto\u buf
将单个单词与正则表达式匹配并从中获取捕获的组会变得非常复杂。一种方法是使用保证发生的字符串的已知部分

对于您的情况,使用\u IntBuf中的字符串
\u和
可以\u Msg\u tmp\u缓冲区我们尝试唯一地识别这些线模式并进行替换

sed  's/\(.*\)_In_IntBuf = \(.*\)can_Msg_tmp_buffer;/\1_In_IntBuf = \2ptr;/'

将单个单词与正则表达式进行匹配并从中获取捕获的组会变得非常复杂。一种方法是使用保证发生的字符串的已知部分

对于您的情况,使用\u IntBuf
中的字符串
\u和
可以\u Msg\u tmp\u缓冲区我们尝试唯一地识别这些线模式并进行替换

sed  's/\(.*\)_In_IntBuf = \(.*\)can_Msg_tmp_buffer;/\1_In_IntBuf = \2ptr;/'

如果您对
awk
没有问题,请尝试以下操作

awk '/_In_IntBuf =/{sub(/can_Msg_tmp_buffer/,"ptr")} 1' Input_file

如果您想将输出保存到输入文件本身,请在上述代码中附加
>临时文件和&mv临时文件输入文件。

如果您同意
awk
请尝试以下操作

awk '/_In_IntBuf =/{sub(/can_Msg_tmp_buffer/,"ptr")} 1' Input_file

如果您想将输出保存到输入文件本身,请在上述代码中附加
>临时文件和&mv临时文件输入文件

我不确定为什么对此问题进行了投票,原因是
问题寻求调试帮助(“此代码为什么不起作用?”)
。Q显然进行了尝试(需要滚动查看
sed
命令),并提供了有效的i/p和预期的o/p。我不确定为什么对此问题进行了投票,原因是
问题寻求调试帮助(“为什么此代码不工作?”)
。Q显然有一次尝试(需要滚动查看
sed
命令),并提供了有效的i/p和预期的o/p。它正常我只需要一个工作解决方案,因为我正在使用上面答案中提供的巨型
C
code
sed
命令。它正常我只需要一个工作解决方案,当我使用巨大的
C
code
sed
时,上面的回答中提供的命令帮助了我。