我的数据文件中有这个字符串(dat.txt)=>
00000
10101
我想要替换第一行,第二列和第四列,我试过这个:
$>sed -i "/^1/s/0/1/2" dat.txt
$>sed -i "/^1/s/0/1/4" dat.txt
但是当我重新加载dat.txt时,它不会改变任何东西。我的命令错了吗?
答案 0 :(得分:2)
试试这个:
sed -i '1{s/./1/2;s/./1/4}' dat.txt
结果:
01010
10101
答案 1 :(得分:1)
替换后的数字是要更改的实例的编号,而不是特定的字符。没有第四个实例,所以第二个没有效果,而第一个应该将第二行更改为10111
。
答案 2 :(得分:1)
首先,除非第一行是第0行,否则您将更改第二行(以1
开头的那一行)。
2
和4
不会更改第二/第四列,它们会更改搜索模式的第二个/第四个出现。
请参阅以下成绩单:
$ 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}}。看这里:
特别是链接指向的部分(限制为行号)和下一个(模式)部分。