cho*_*oba 409
该-i
选项将编辑的内容流式传输到新文件中,然后在幕后重命名.
例:
sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' filename
Run Code Online (Sandbox Code Playgroud)
和
sed -i '' 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' filename
Run Code Online (Sandbox Code Playgroud)
在macOS上.
Ste*_*eve 70
在一个sed
无法编辑文件的系统上,我认为更好的解决方案是使用perl
:
perl -pi -e 's/foo/bar/g' file.txt
Run Code Online (Sandbox Code Playgroud)
虽然这确实创建了一个临时文件,但它会替换原始文件,因为提供了一个空的就位后缀/扩展名.
小智 52
请注意,在OS X上,运行此命令时可能会出现"无效命令代码"或其他奇怪错误等奇怪错误.要解决此问题,请尝试
sed -i '' -e "s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g" <file>
Run Code Online (Sandbox Code Playgroud)
这是因为在OSX版本中sed
,该-i
选项需要一个extension
参数,因此您的命令实际上被解析为extension
参数,文件路径被解释为命令代码.资料来源:https://stackoverflow.com/a/19457213
min*_*s23 23
以下在我的Mac上工作正常
sed -i.bak 's/foo/bar/g' sample
Run Code Online (Sandbox Code Playgroud)
我们正在用示例文件中的bar替换foo.原始文件的备份将保存在sample.bak中
要在没有备份的情况下编辑内联,请使用以下命令
sed -i'' 's/foo/bar/g' sample
Run Code Online (Sandbox Code Playgroud)
Dwi*_*cer 15
有一点需要注意,sed
不能自己编写文件,因为sed的唯一目的是充当"流"的编辑器(即stdin,stdout,stderr和其他>&n
缓冲区,套接字等的流水线).考虑到这一点,您可以使用另一个命令tee
将输出写回文件.另一种选择是创建一个补丁,将内容管道化diff
.
Tee方法
sed
补丁方法
>&n
更新:
另外,请注意补丁将从diff输出的第1行获取文件:
补丁不需要知道要访问哪个文件,因为这是在diff的输出的第一行中找到的:
sed '/regex/' <file> | tee <file>
Run Code Online (Sandbox Code Playgroud)
Wil*_*ell 10
你不可能做你想做的事sed
.甚至sed
那些支持-i
编辑文件的选项的版本也完全按照您明确声明的不需要的方式执行:它们写入临时文件然后重命名该文件.但也许你可以使用ed
.例如,改变所有出现foo
到bar
文件中file.txt
,你可以这样做:
echo ',s/foo/bar/g; w' | tr \; '\012' | ed -s file.txt
Run Code Online (Sandbox Code Playgroud)
语法类似sed
,但肯定不完全相同.
但也许你应该考虑为什么你不想使用重命名的临时文件.即使您没有-i
支持sed
,也可以轻松编写脚本来为您完成工作.而不是sed -i 's/foo/bar/g' file
,你可以做到inline file sed 's/foo/bar/g'
.写这样一个脚本是微不足道的.例如:
#!/bin/sh -e
IN=$1
shift
trap 'rm -f $tmp' 0
tmp=$( mktemp )
<$IN "$@" >$tmp && cat $tmp > $IN # preserve hard links
Run Code Online (Sandbox Code Playgroud)
应该适合大多数用途.
sed支持就地编辑.来自man sed
:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
Run Code Online (Sandbox Code Playgroud)
示例:
假设您有一个hello.txt
包含文本的文件:
hello world!
Run Code Online (Sandbox Code Playgroud)
如果要保留旧文件的备份,请使用:
sed -i.bak 's/hello/bonjour' hello.txt
Run Code Online (Sandbox Code Playgroud)
您将得到两个文件:hello.txt
内容:
bonjour world!
Run Code Online (Sandbox Code Playgroud)
和hello.txt.bak
旧的内容.
如果您不想保留副本,请不要传递扩展参数.
您还可以使用重定向运算符<>
打开文件进行读写:
sed 's/foo/bar/g' file 1<> file
Run Code Online (Sandbox Code Playgroud)
现场观看:
$ cat file
hello
i am here # see "here"
$ sed 's/here/away/' file 1<> file # Run the `sed` command
$ cat file
hello
i am away # this line is changed now
Run Code Online (Sandbox Code Playgroud)
来自Bash 参考手册?3.6.10 打开文件描述符进行读写:
重定向运算符
Run Code Online (Sandbox Code Playgroud)[n]<>word
导致名称为 word 扩展的文件被打开,以便在文件描述符 n 上读取和写入,如果未指定 n,则在文件描述符 0 上打开。如果文件不存在,则创建它。