如何使用sed删除字符第n次出现后所有内容并就地修改文件
sed实现删除指定行第n个逗号后内容的方案
原写法变量不生效的原因
变量未解析是shell引号规则导致的:shell中单引号包裹的内容不会执行变量展开,你之前的sed命令把表达式放在单引号内,$grepresult就被当成了普通字符串输出,和sed本身无关。sed完全支持在表达式中使用shell变量,只要正确使用双引号包裹需要展开变量的部分即可。
如果要继续用先存变量再替换的写法,修正引号即可:
grepresult="$(grep ExportFormatNames test.txt | cut -f1-14 -d',')" sed -i "/ExportFormatNames/c\\$grepresult" test.txt
直接用sed实现就地修改的方案
无需提前提取内容存储变量,单条sed命令即可实现需求:
Linux(GNU sed)环境命令
sed -i '/ExportFormatNames/s/^\(\([^,]*,)\{13\}[^,]*\),.*/\1/' test.txt
macOS(BSD sed)环境命令
macOS下sed的-i参数需要额外传空字符串作为备份后缀参数:
sed -i '' '/ExportFormatNames/s/^\(\([^,]*,)\{13\}[^,]*\),.*/\1/' test.txt
命令逻辑说明
/ExportFormatNames/:只对文件中包含ExportFormatNames的行执行后续替换操作- 正则
^\(\([^,]*,)\{13\}[^,]*\),.*解释:([^,]*,):匹配「任意非逗号字符+逗号」的组合{13}:上述组合重复13次,对应前13个逗号和前13个字段[^,]*:匹配第14个字段的所有非逗号内容- 外层括号把前面这部分捕获为分组1
- 最后的
,.*:匹配第14个逗号以及之后的所有内容
- 替换为
\1:只保留分组1的内容,也就是前14个字段,自动删除第14个逗号及之后的所有内容
动态指定删除位置的写法
如果需要灵活修改要删除的逗号序号n,可以用shell变量传参实现:
n=14 # 要删除第n个逗号及之后的内容 sed -i "/ExportFormatNames/s/^\(\([^,]*,\)\{$((n-1))\}[^,]*\),.*/\1/" test.txt
这里把sed表达式放在双引号内,即可正确展开shell变量,$((n-1))是shell算术运算,自动计算需要匹配的前置逗号数量。
内容的提问来源于stack exchange,提问作者user3447273
相关产品推荐
相关产品推荐

