使用sed替换固定宽度文件中的特定列

时间:2010-11-24 03:04:53

标签: bash sed

我的数据文件中有这个字符串(dat.txt)=>

00000
10101

我想要替换第一行,第二列和第四列,我试过这个:

$>sed -i "/^1/s/0/1/2" dat.txt
$>sed -i "/^1/s/0/1/4" dat.txt

但是当我重新加载dat.txt时,它不会改变任何东西。我的命令错了吗?

4 个答案:

答案 0 :(得分:2)

试试这个:

sed -i '1{s/./1/2;s/./1/4}' dat.txt

结果:

01010
10101

答案 1 :(得分:1)

替换后的数字是要更改的实例的编号,而不是特定的字符。没有第四个实例,所以第二个没有效果,而第一个应该将第二行更改为10111

答案 2 :(得分:1)

首先,除非第一行是第0行,否则您将更改第二行(以1开头的那一行)。

24不会更改第二/第四列,它们会更改搜索模式的第二个/第四个出现

请参阅以下成绩单:

$ cat dat.txt
00000
10101

$ sed -i "/^1/s/0/1/2" dat.txt ; cat dat.txt
00000
10111

$ sed -i "/^1/s/0/1/4" dat.txt ; cat dat.txt
00000
10111

您可以看到第一个sed将第二次0更改为1,这是第四列。第二个sed没有改变,因为你要求它在第四次出现时没有改变,并且那里没有四个0字符。

如果您想更改特定的,可以使用捕获模式,如下面的记录:

$ cat dat.txt
00000
10101

$ sed -i "/^1/s/^\(.\)0/\11/" dat.txt ; cat dat.txt
00000
11101

$ sed -i "/^1/s/^\(...\)0/\11/" dat.txt ; cat dat.txt
00000
11111

括号捕获模式,以便替换文本中的\1可用于引用捕获的文本。因为您要在要更改的字符之前讨论少量字符,所以可以使用...作为模式。如果您想更改(例如)85 th 列,您可能会更喜欢以下内容:

sed -i "/^1/s/^\(.\{84\}\)0/\11/" dat.txt ; cat dat.txt

答案 3 :(得分:0)

这应该这样做:

sed -i -e '1 s/0/1/2' -e '1 s/0/1/3' dat.txt

-e表示添加命令,因此它们一个接一个地执行。你也可以用这个:

sed -i '1 s/0/1/2; 1 s/0/1/3' dat.txt

请注意,在您的问题中,在/^1/命令之前s部分表示sed意味着:更改所有开头的行(^表示'匹配行的开头')与{{ 1}}。看这里:

特别是链接指向的部分(限制为行号)和下一个(模式)部分。