如何在CSV文件标题行第24位添加空格?sed命令失效求助
问题解决:在指定行的固定位置插入空格
我有如下格式的文件内容:
# 2022 5 2 8 1 24.8-17.1800 -66.3260 3.6 0.2 0.0 0.0 0.0 2 SOD6 2.20 1.00 P SOD6 3.98 1.00 S SOD5 3.21 1.00 P SOD5 5.79 1.00 S SOD0 4.07 1.00 P SOD0 7.10 1.00 S SOD3 6.47 1.00 P SOD3 11.20 1.00 S # 2022 5 3 0 10 16.8-17.3820 -65.6330 28.0 0.7 0.0 0.0 0.3 3 SOD2 6.24 1.00 P SOD2 10.49 1.00 S SOD9 7.66 1.00 P SOD9 12.75 1.00 S SOD1 10.34 1.00 P SOD3 11.42 1.00 P SOD3 21.11 1.00 S # 2022 5 3 11 28 10.8-17.7600 -65.9840 6.6 0.7 0.0 0.0 0.1 4 SOD3 6.55 1.00 P SOD2 6.89 1.00 P SOD2 11.70 1.00 S SOD9 8.82 1.00 P SOD1 10.04 1.00 P SOD1 17.60 1.00 S
需求是:给所有以# 2022开头的标题行,在第24个字符位置插入空格。比如原标题行:
# 2022 5 2 8 1 24.8-17.1800 -66.3260 3.6 0.2 0.0 0.0 0.0 2
修改后变为:
# 2022 5 2 8 1 24.8 -17.1800 -66.3260 3.6 0.2 0.0 0.0 0.0 2
我尝试了以下命令,但没有效果:
# 读取标题行并在第24位添加空格,phase.dat为目标CSV文件 grep '# 2022' phase.dat | sed 's/ ./&\s /24'
错误原因分析
你用的sed命令逻辑完全不对:
s/ ./&\s /24里的./是匹配「任意单个字符+空格」的组合,这和你要定位到第24个字符位置的需求完全不沾边;- 末尾的
24是告诉sed替换第24次匹配到的上述组合,不是让它跳到第24个字符的位置; - 先用
grep过滤标题行再处理,会把文件里的其他行都丢掉,如果你要保留整个文件的内容,这种方式也不可取。
正确解决方案
直接用sed处理整个文件,只针对以# 2022开头的行,在第24个字符位置插入空格:
sed '/^# 2022/s/^\(.\{23\}\)/\1 /' phase.dat
命令解释:
/^# 2022/:只匹配以# 2022开头的行;s/^\(.\{23\}\)/\1 /:^表示行开头;\(.\{23\}\)捕获前23个任意字符;\1引用捕获的内容,后面加一个空格,相当于在第24位插入空格。
如果需要直接修改原文件(建议先备份),可以加-i参数:
sed -i.bak '/^# 2022/s/^\(.\{23\}\)/\1 /' phase.dat
(-i.bak会在修改原文件前创建后缀为.bak的备份文件)
内容的提问来源于stack exchange,提问作者tonino
相关产品推荐
相关产品推荐

