OS X 中的一行 sed 命令:替换特定行

One line sed command in OS X : replace a specific line

我想用文本 4 5 6 替换 sample.txt 文件的第二行。在 Linux 我使用:

sed '2,2c 5 6' sample.txt

但是,在Mac OS X 中,这不起作用。此问题的解决方法是编写一个脚本,其中替换文本应保留在换行符中:

#!/bin/sh
sed -e "2,2c\
4 5 6" sample.txt

N.B。 -e 和双引号 " " 在这里很重要(我不知道为什么)。

我的问题是,我可以将脚本合并为一行命令吗?*

当我想将它用作程序中的命令时,这会很有用,比如在 Fortran 中。

我不愿意安装gnu-sed

再总结一遍:

cat sample.txt 产量

1 2 3
1 2 3
7 8 9

使用单行命令,我想将文件内容修改为:

1 2 3
4 5 6
7 8 9

也许使用 awk 以获得更一致的行为:

$ awk 'NR==2 {[=10=]="4 5 6"} 1' file
1 2 3
4 5 6
7 8 9

这个告诉awk刚好在NR==2的时候做一些事情,也就是我们在第2行的时候。这个东西就是把那行替换成4 5 6.

然后,1 触发默认的 awk 操作:打印当前行。

更新

如果你想从另一个文件中获取内容,只需将它存储在一个变量中:

awk -v file_info="$(cat another_file)" 'NR==2 {[=11=]=file_info} 1' file

测试

$ cat f1
1 2 3
1 2 3
7 8 9
$ cat f2
hello this is me
and that is another thing
$ awk -v f="$(cat f2)" 'NR==2 {[=12=]=f} 1' f1
1 2 3
hello this is me
and that is another thing
7 8 9

你可以写一个sed脚本并使用c\:

$ cat myscript
2c\
4 5 6

然后:

$ cat sample.txt | sed -f myscript

另一个想法是使用 s 代替:

$ cat sample.txt | sed '2s/.*/4 5 6/'

结果是一样的,但是多了一个模式匹配操作。