首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅在与模式匹配的行中替换字符串?

如何仅在与模式匹配的行中替换字符串?
EN

Stack Overflow用户
提问于 2020-04-08 17:58:30
回答 1查看 43关注 0票数 0

我想在包含stringA所属模式的所有文件中用"stringB“替换"stringA”,并且只在这些行中进行替换。使用sed,我可以替换整个文件中的字符串,而不是行解析。

例如:

我只想用dest_ip4_addr替换所有这些文件中的那些行(如果该行包含stringA)中的ip4_addr:

代码语言:javascript
复制
sergey@ipkt /proj/sergey/platform (master) $ git grep -n ipkt_dp_filter_ipv4
ipkt-app/include/ipkt_dp_filter_api.h:7:ipkt_err_t ipkt_dp_filter_ipv4_add(uint16 vlan, uint32 ip4_addr, uint32 ip4_mask, bool is_stateful);
ipkt-app/include/ipkt_dp_filter_api.h:9:ipkt_err_t ipkt_dp_filter_ipv4_delete(uint16 vlan, uint32 ip4_addr, uint32 ip4_mask);
ipkt-app/ipkt-bm/ipkt_cmd.c:559:        SHR_IF_ERR_EXIT(ipkt_dp_filter_ipv4_add(vid, ip4_addr, ip4_mask, statefull_flag));
ipkt-app/ipkt-bm/ipkt_cmd.c:563:        SHR_IF_ERR_EXIT(ipkt_dp_filter_ipv4_delete(vid, ip4_addr, ip4_mask));
ipkt-app/ipkt-bm/ipkt_dp_filter_api.c:5:ipkt_err_t ipkt_dp_filter_ipv4_add(uint16 vlan, uint32 ip4_addr, uint32 ip4_mask, bool is_stateful)
ipkt-app/ipkt-bm/ipkt_dp_filter_api.c:13:ipkt_err_t ipkt_dp_filter_ipv4_delete(uint16 vlan, uint32 ip4_addr, uint32 ip4_mask)
ipkt-app/ipkt-rpc/server_rpc_wrappers.cpp:396:int rpc_ipkt_dp_filter_ipv4_add(uint16 vlan, std::string ip4_addr, uint32 mask, bool is_stateful){
ipkt-app/ipkt-rpc/server_rpc_wrappers.cpp:402:    CALL_IPKT(ipkt_dp_filter_ipv4_add(vlan, ipkt_ip, mask, is_stateful));
ipkt-app/ipkt-rpc/server_rpc_wrappers.cpp:405:int rpc_ipkt_dp_filter_ipv4_delete(uint16 vlan, std::string ip4_addr, uint32 mask){
ipkt-app/ipkt-rpc/server_rpc_wrappers.cpp:411:    CALL_IPKT(ipkt_dp_filter_ipv4_delete(vlan, ipkt_ip, mask));
ipkt-app/ipkt-rpc/server_rpc_wrappers.cpp:591:    srv.bind("ipkt_dp_filter_ipv4_add", &rpc_ipkt_dp_filter_ipv4_add);
ipkt-app/ipkt-rpc/server_rpc_wrappers.cpp:592:    srv.bind("ipkt_dp_filter_ipv4_delete", &rpc_ipkt_dp_filter_ipv4_delete);

我尝试过的事情:

代码语言:javascript
复制
grep -rl ipkt_dp_filter_ipv4 ipkt-app/ | grep -v swp | xargs sed -i 's/ip4_addr/dest_ip4_addr/'

这改变了我不想更改的额外代码行。

代码语言:javascript
复制
git grep -l ipkt_dp_filter_ipv4 | xargs sed -i 's/ipkt_dp_filter_ipv4_.*uint32 /& dest_/'

我也尝试过regex,但我不知道如何在regex中替换字符串。

EN

回答 1

Stack Overflow用户

发布于 2020-04-08 21:01:58

使用awk

awk '{ if($0~/stringA/) gsub(/ip4_addr/,"dest_ip4_addr",$0)} 1 < input file'

演示:将记录开头的a替换为a

代码语言:javascript
复制
$echo -e  "abca\nefga\n123a"
abca
efga
123a
$echo -e  "abca\nefga\n123a"  | awk '{ if($0~/^a/) gsub(/a/,"d",$0)} 1' 
dbcd
efga
123a
$
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61097988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档