我想在包含stringA所属模式的所有文件中用"stringB“替换"stringA”,并且只在这些行中进行替换。使用sed,我可以替换整个文件中的字符串,而不是行解析。
例如:
我只想用dest_ip4_addr替换所有这些文件中的那些行(如果该行包含stringA)中的ip4_addr:
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);我尝试过的事情:
grep -rl ipkt_dp_filter_ipv4 ipkt-app/ | grep -v swp | xargs sed -i 's/ip4_addr/dest_ip4_addr/'这改变了我不想更改的额外代码行。
git grep -l ipkt_dp_filter_ipv4 | xargs sed -i 's/ipkt_dp_filter_ipv4_.*uint32 /& dest_/'我也尝试过regex,但我不知道如何在regex中替换字符串。
发布于 2020-04-08 21:01:58
使用awk
awk '{ if($0~/stringA/) gsub(/ip4_addr/,"dest_ip4_addr",$0)} 1 < input file'
演示:将记录开头的a替换为a
$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
$https://stackoverflow.com/questions/61097988
复制相似问题