如何用Shell脚本仅清理文件第二列的多余字符?
问题描述
我有一个file.txt文件,内容如下:
AYOnanl3knsgv2StRr44 CRITICAL","component MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr45 CRITICAL","component MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr46 CRITICAL","component MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr47 CRITICAL","component MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnanmeknsgv2StRr48 MAJOR", MMP-FileService gbhasrajkn@vir.com CODE_SMELL AYOnanm-knsgv2StRr4- BLOCKER", MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnanm6knsgv2StRr49 MAJOR", MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnannKknsgv2StRr4_ BLOCKER", MMP-FileService nipun.dith@wt.com BUG AYODwmuBknsgv2StRqkr MINOR", MMP-FileService sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqkt MINOR", MMP-FileService sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqks MINOR", MMP-component sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqku MINOR", MMP-component sam.curren@wt.com CODE_SMELL AYODsI7Fknsgv2StRqac MAJOR", MMP-component sam.curren@wt.com CODE_SMELL AYODsI7Nknsgv2StRqad MAJOR", MMP-component sam.curren@wt.com CODE_SMELL AYODsI-Qknsgv2StRqai MAJOR", MMP-component sam.curren@wt.com CODE_SMELL
需要移除第二列中的多余字符:","component和",,预期输出为:
AYOnanl3knsgv2StRr44 CRITICAL MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr45 CRITICAL MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr46 CRITICAL MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr47 CRITICAL MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnanmeknsgv2StRr48 MAJOR MMP-FileService gbhasrajkn@vir.com CODE_SMELL AYOnanm-knsgv2StRr4- BLOCKER MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnanm6knsgv2StRr49 MAJOR MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnannKknsgv2StRr4_ BLOCKER MMP-FileService nipun.dith@wt.com BUG AYODwmuBknsgv2StRqkr MINOR MMP-FileService sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqkt MINOR MMP-FileService sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqks MINOR MMP-component sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqku MINOR MMP-component sam.curren@wt.com CODE_SMELL AYODsI7Fknsgv2StRqac MAJOR MMP-component sam.curren@wt.com CODE_SMELL AYODsI7Nknsgv2StRqad MAJOR MMP-component sam.curren@wt.com CODE_SMELL AYODsI-Qknsgv2StRqai MAJOR MMP-component sam.curren@wt.com CODE_SMELL
我尝试执行命令:
cat file.txt | tr -d '",' | sed 's/component//'
但该命令会修改其他列(如第三列),导致输出异常:
YOnanl3knsgv2StRr44 CRITICAL MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr45 CRITICAL MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr46 CRITICAL MMP-FileService James.curren@wt.com CODE_SMELL AYOnanl3knsgv2StRr47 CRITICAL MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnanmeknsgv2StRr48 MAJOR MMP-FileService gbhasran@virtusa.com CODE_SMELL AYOnanm-knsgv2StRr4- BLOCKER MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnanm6knsgv2StRr49 MAJOR MMP-FileService nipun.dith@wt.com CODE_SMELL AYOnannKknsgv2StRr4_ BLOCKER MMP-FileService nipun.dith@wt.com BUG AYODwmuBknsgv2StRqkr MINOR MMP-FileService sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqkt MINOR MMP-FileService sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqks MINOR MMP- sam.curren@wt.com CODE_SMELL AYODwmuBknsgv2StRqku MINOR MMP- sam.curren@wt.com CODE_SMELL AYODsI7Fknsgv2StRqac MAJOR MMP- sam.curren@wt.com CODE_SMELL AYODsI7Nknsgv2StRqad MAJOR MMP- sam.curren@wt.com CODE_SMELL AYODsI-Qknsgv2StRqai MAJOR MMP- sam.curren@wt.com CODE_SMELL
请问如何仅对第二列执行清理操作?注:禁止使用jq、JavaScript、Python等工具。
解决方案
可以用sed的分组匹配替换,精准定位第二列的多余字符,不影响其他列:
sed -E 's/^([^[:space:]]+[[:space:]]+)([A-Z]+)"(,"component|,)/\1\2/' file.txt
命令解释:
^([^[:space:]]+[[:space:]]+):匹配并捕获第一列内容(包括后面的空格),作为第一个分组\1([A-Z]+):捕获第二列的核心状态词(CRITICAL/MAJOR/BLOCKER/MINOR),作为第二个分组\2"(,"component|,):匹配第二列后面的多余部分——要么是",component,要么是",`\1\2:替换为第一分组+第二分组,也就是保留前两列的核心内容,去掉多余字符
补充优化:
如果需要统一第二列后面的空格对齐,可以在替换后再加一个sed命令调整格式:
sed -E 's/^([^[:space:]]+[[:space:]]+)([A-Z]+)"(,"component|,)/\1\2/' file.txt | sed -E 's/([A-Z]+)[[:space:]]+/\1 /'
这个命令会把第二列后面的多个空格替换成两个空格,让输出和预期格式更一致。
内容的提问来源于stack exchange,提问作者Zero5
相关产品推荐
相关产品推荐

