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

时间:2015-01-13 13:25:02

标签: macos shell sed

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

sed '2,2c\4 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

感谢。

2 个答案:

答案 0 :(得分:2)

也许使用awk来保持更一致的行为:

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

这会告诉awkNR==2时执行某些操作,也就是说,当我们在第2行时。这就是用4 5 6替换该行。

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

更新

如果您想从其他文件中获取内容,只需将其存储在变量中:

awk -v file_info="$(cat another_file)" 'NR==2 {$0=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 {$0=f} 1' f1
1 2 3
hello this is me
and that is another thing
7 8 9

答案 1 :(得分:0)

您可以编写一个sed脚本并使用c\

$ cat myscript
2c\
4 5 6

然后:

$ cat sample.txt | sed -f myscript

另一个想法是改为使用s

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

结果是一样的,但有额外的模式匹配操作。