我想用文本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
感谢。
答案 0 :(得分:2)
也许使用awk
来保持更一致的行为:
$ awk 'NR==2 {$0="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 {$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/'
结果是一样的,但有额外的模式匹配操作。