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/'
结果是一样的,但是多了一个模式匹配操作。
我想用文本 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/'
结果是一样的,但是多了一个模式匹配操作。