Awk 在包含引号和逗号的特定模式后替换文本

Awk 在包含引号和逗号的特定模式后替换文本,awk,sed,Awk,Sed,我有以下csv文件: "Function","Source","Line","FnCov","C/D Coverage","out of","%" "sharp_coll_env2bool","../../src/coll/util.c",176,1,1,34,2% "TreeManager::SortTreeRootsByGroup","../../src/am/tree_manager.cpp",1467,1,1,26,3% "FabricGraph::MadSendRetry","../.

我有以下csv文件:

"Function","Source","Line","FnCov","C/D Coverage","out of","%"
"sharp_coll_env2bool","../../src/coll/util.c",176,1,1,34,2%
"TreeManager::SortTreeRootsByGroup","../../src/am/tree_manager.cpp",1467,1,1,26,3%
"FabricGraph::MadSendRetry","../../src/am/fabric_graph.cpp",2170,1,1,16,6%
"ibis_log_mad_function","../../src/am/fabric_provider.cpp",93,1,1,12,8%
"__free_context","../../src/external/mellanox/alog/src/core/media/alog_media.c",415,1,2,13,15%
我需要删除第二个单元格中第一个“/src”前面的所有内容

"Function","Source","Line","FnCov","C/D Coverage","out of","%"
"sharp_coll_env2bool","/src/coll/util.c",176,1,1,34,2%
"TreeManager::SortTreeRootsByGroup","/src/am/tree_manager.cpp",1467,1,1,26,3%
"FabricGraph::MadSendRetry","/src/am/fabric_graph.cpp",2170,1,1,16,6%
"ibis_log_mad_function","/src/am/fabric_provider.cpp",93,1,1,12,8%
"__free_context","/src/external/mellanox/alog/src/core/media/alog_media.c",415,1,2,13,15%
到目前为止,我尝试了以下方法:

sed -i -r 's|(["'\''],.*\/src)|"src"|g'
它不处理引号

awk -F, '{gsub(/\.*src/,"",$2); print}
它替换了所有内容并破坏了文件

只需:

sed 's,[^"]*src,/src,' <file>
你可以阅读一些更健壮的东西


编辑:


现在它删除的不仅仅是第一个“/src/”。我有什么调整吗 您可以只删除第一个吗?-一个小时前,我是迈克尔

您可以将perl用于非贪婪正则表达式:

perl -pe 's,[^"]*?src,/src,' <file>
输出:

"Function","Source","Line","FnCov","C/D Coverage","out of","%"
"sharp_coll_env2bool","/src/coll/util.c",176,1,1,34,2%
"TreeManager::SortTreeRootsByGroup","/src/am/tree_manager.cpp",1467,1,1,26,3%
"FabricGraph::MadSendRetry","/src/am/fabric_graph.cpp",2170,1,1,16,6%
"ibis_log_mad_function","/src/am/fabric_provider.cpp",93,1,1,12,8%
"__free_context","/src/external/mellanox/alog/src/core/media/alog_media.c",415,1,2,13,15%
"FabricUpdateType2Char","/src/am/fabric_update.h",60,1,1,5,20% 
"CaPortType2Char","/src/am/port_data.h",56,1,1,5,20% 
"smx_init","/src/smx/smx.c",130,1,4,18,22% 
"dev_sa_response_method","/src/sr/sr.c",30,1,2,9,22%
编辑:在此处添加更通用的解决方案,这将删除文本,直到仅删除第一个src字符串

awk -v s1="\"" -v var="src" 'BEGIN{FS=OFS=","} 
{
  for(j=1;j<=NF;j++){
     val=index($j,var)
     if(val){
       $j=s1 "/src" substr($j,val+3)
       val=""
     }
  }
  val=""
}
1
'  Input_file

因此,我们鼓励用户发布他们为解决自己的问题所做的努力,请添加,然后让我们知道。您也可以在SO上使用搜索功能来查找与类似问题相关的指导。我已经尝试使用以下命令:sed-I-r的|([“\”,.\/src)|“src”| g'-它不处理引号。awk-F,“{gsub(/\.*src/,”,$2);print}-替换了所有内容并破坏了文件“请在帖子中添加这些命令,评论不是为了直接发布codesTry,没有任何逗号和引号,就像您在
sed
上使用相同的
|
分隔符一样。这是否保证“删除第一个/src之前的所有内容”“?@Kent很明显,不是。如果您有
/
以外的字符,RavinderSingh13的解决方案可能更方便。我在我的解决方案中提供的链接可能会引导您找到最可靠的解决方案。无论如何,如果您有一些具体的问题需要处理,请添加一些额外的示例。您的解决方案适用于某些情况,但不适用于此情况,原因是:“FabricUpdateType2Char”,“./mtrswgwork/dmitriyu/sharp_ws3/auto/mtrswgwork/dmitriyu/sharp_ws3/sharp/src/am/fabric_update.h”,60,1,1,5,20%“CaPortType2Char”,“./auto/mtrswgwork/dmitriyu/sharp_ws3/auto/mtrswgwork/dmitriyu/sharp_/sharp_ws3/sharp/sharp/srp/src/am/port_data.h”,56,1,1,5,20%“smx_init”,“./auto/mtrswgwgwork/wstriyu/sharp/sharp/smx/sm/smx/smx“,130,1,4,18,22%,”开发响应方法“,”./auto/dmitriyu/sharp/to/mtrswgwork/dmitriyu/sharp\u ws3/sharp/src/sr/sr.c“,30,1,2,9,22%任何ISEA?现在它删除的比第一个“/src/”多。我能做些什么调整来只删除第一个吗?@Ofir Michael,感谢您选择正确的答案,如果有任何疑问,请告诉我您的解决方案非常优雅,但删除的比第一个“/src/”多。我是否可以做任何调整,只删除第一个“awk:BEGIN{FS=OFS=“,”}{for(j=1;j@OfirMichael,不清楚,因为没有添加背面标记,请您现在打开一个聊天室好吗?我们都可以讨论这个问题。
"Function","Source","Line","FnCov","C/D Coverage","out of","%"
"sharp_coll_env2bool","/src/coll/util.c",176,1,1,34,2%
"TreeManager::SortTreeRootsByGroup","/src/am/tree_manager.cpp",1467,1,1,26,3%
"FabricGraph::MadSendRetry","/src/am/fabric_graph.cpp",2170,1,1,16,6%
"ibis_log_mad_function","/src/am/fabric_provider.cpp",93,1,1,12,8%
"__free_context","/src/external/mellanox/alog/src/core/media/alog_media.c",415,1,2,13,15%
"FabricUpdateType2Char","/src/am/fabric_update.h",60,1,1,5,20% 
"CaPortType2Char","/src/am/port_data.h",56,1,1,5,20% 
"smx_init","/src/smx/smx.c",130,1,4,18,22% 
"dev_sa_response_method","/src/sr/sr.c",30,1,2,9,22%
awk -v s1="\"" -v var="src" 'BEGIN{FS=OFS=","} 
{
  for(j=1;j<=NF;j++){
     val=index($j,var)
     if(val){
       $j=s1 "/src" substr($j,val+3)
       val=""
     }
  }
  val=""
}
1
'  Input_file
awk -v s1="\"" 'BEGIN{FS=OFS=","} {for(j=1;j<=NF;j++){if($j~/src/){sub(/.*src/,s1 "/src",$j)}}} 1'  Input_file
sed 's/..\/..\/src/\/src/g' Inputfile