Unix下删除指定模式(含模式及前置逗号)后的所有内容
解决方法:修正sed正则匹配规则
你的问题出在原来的sed命令没有覆盖到Date前面的逗号,也没完全匹配Date本身及后续所有内容。试试下面的命令,完美满足你的需求:
PARTITION_COLUMN='Date' echo "replenishment_category string,Date string" | sed -E "s/,?$PARTITION_COLUMN.*//"
执行后输出会是:
replenishment_category string
为什么原来的命令不行?
你之前的命令是:
sed "s/"$PARTITION_COLUMN".* //g"
这个正则的问题在于:
- 没有匹配
Date前面可能存在的逗号,导致逗号残留 - 末尾多了一个空格,只会匹配
Date后面带空格的内容,原字符串里Date后面的string没被完全替换,反而留下了string部分 - 没有把
Date本身纳入替换范围,只是替换了它后面的内容
修正后的正则解释
-E参数启用扩展正则表达式,让语法更简洁:
,?:匹配0个或1个逗号(确保如果Date前面有逗号,会一并删掉)$PARTITION_COLUMN:匹配变量里的Date字符串.*:匹配Date之后的所有内容(包括空格和字符)- 最后用空字符串替换匹配到的所有内容,就实现了删除从
Date(含)及前面逗号(如果有)开始的所有内容的效果
额外测试场景
如果你的字符串里Date前面没有逗号,比如:
echo "replenishment_category stringDate string" | sed -E "s/,?$PARTITION_COLUMN.*//"
输出依然正确:
replenishment_category string
内容的提问来源于stack exchange,提问作者av abhishiek
相关产品推荐
相关产品推荐

