我想通过命令行在HTML文件上运行查找和替换。

我的命令看起来像这样:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html

当我运行它并在之后查看该文件时,它是空的。它删除了我文件的内容。

当我再次恢复文件后运行这个:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

stdout是文件的内容,并且已经执行了查找和替换。

为什么会这样?


当前回答

命令的问题

sed 'code' file > file

该文件在sed实际处理它之前被shell截断。结果,您将得到一个空文件。

sed的方法是使用-i来就地编辑,正如其他答案所建议的那样。然而,这并不总是你想要的。-i将创建一个临时文件,然后用于替换原始文件。如果您的原始文件是一个链接(该链接将被一个常规文件取代),这就有问题了。如果你需要保存链接,你可以使用一个临时变量来存储sed的输出,然后再把它写回文件,就像这样:

tmp=$(sed 'code' file); echo -n "$tmp" > file

更好的是,使用printf而不是echo,因为echo在某些shell(例如dash)中很可能将\\处理为\:

tmp=$(sed 'code' file); printf "%s" "$tmp" > file

其他回答

您应该尝试使用-i选项进行就地编辑。

另一种有用的模式是:

sed -e 'script script' index.html > index.html.tmp && mv index.html.tmp index.html

这具有大致相同的效果,但不使用-i选项,并且还意味着,如果sed脚本由于某种原因失败,输入文件也不会被破坏。此外,如果编辑成功,就不会留下备份文件。这种习惯用法在makefile中很有用。

很多seed都有-i选项,但不是所有的;posix sed则不是。因此,如果您的目标是可移植性,最好避免使用这种方法。

ed的答案是:

printf "%s\n" '1,$s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' w q | ed index.html

为了重申codaddict的回答,shell首先处理重定向,清除“input.html”文件,然后调用“sed”命令,向其传递一个现在为空的文件。

sed -i 's/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g' index.html

这将对文件index.html进行全局就地替换。引用字符串可以防止查询和替换中出现空白的问题。

我正在寻找可以定义直线范围的选项,并找到了答案。例如,我想将host1从第36-57行更改为host2。

sed '36,57 s/host1/host2/g' myfile.txt > myfile1.txt

你也可以使用gi选项来忽略字符大小写。

sed '30,40 s/version/story/gi' myfile.txt > myfile1.txt