当。。。的时候 的 贝壳 强> 看到 > index.html 在命令行中打开文件 index.html 对于 的 写作 强> ,擦掉以前的所有内容。
> index.html
index.html
要解决这个问题,你需要通过 -i 选项 sed 在内部进行更改之前,进行内联更改并创建原始文件的备份:
-i
sed
sed -i.bak s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html
如果没有.bak,命令将在某些平台上失败,例如Mac OSX。
另一种有用的模式是:
sed -e 'script script' index.html > index.html.tmp && mv index.html.tmp index.html
这有很多相同的效果,没有使用 -i 选项,另外还意味着,如果sed脚本由于某种原因失败,则输入文件不会被破坏。此外,如果编辑成功,则没有剩余的备份文件。这种习惯用法在Makefile中很有用。
相当多的seds有 -i 选项,但不是全部; posix sed是一个没有的。因此,如果您的目标是可移植性,那么最好避免使用。
在充分尊重上述正确答案的情况下,这样的“干运行”脚本总是一个好主意,这样您就不会破坏文件并且必须从头开始。
只需让你的脚本将输出溢出到命令行而不是将其写入文件,例如,像这样:
sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html
要么
less index.html | sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g
这样,您可以查看并检查命令的输出,而不会截断文件。
您应该尝试使用该选项 -i 用于就地编辑。
而且 ed 回答:
ed
printf "%s\n" '1,$s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' w q | ed index.html
重申一下 codaddict回答 ,shell处理重定向 的 第一 强> ,擦除“input.html”文件,和 然后 shell调用“sed”命令传递一个现在为空的文件。
使用sed的-i选项,例如
sed -i bak -e s/STRING_TO_REPLACE/REPLACE_WITH/g index.html
要更改多个文件(并将每个文件的备份保存为* .bak):
perl -p -i -e "s/\|/x/g" *
将获取目录中的所有文件并替换 | 同 x 这被称为Perl pie锟(简单就像一个馅饼)
|
x
sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' index.html
这会对文件index.html进行全局就地替换。引用字符串可以防止查询和替换中的空格问题。
我正在寻找可以定义行范围并找到答案的选项。例如,我想从第36-57行将host1更改为host2。
sed '36,57 s/host1/host2/g' myfile.txt > myfile1.txt
您也可以使用gi选项忽略字符大小写。
sed '30,40 s/version/story/gi' myfile.txt > myfile1.txt
您可以在Ex模式下使用Vim:
ex -sc '%s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g|x' index.html
% 选择所有行
%
x 保存并关闭