我正在尝试>>>
用文件中的“”替换
cat table_files.md | egrep ">>>$"
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
用 sed 替换它
cat table_files.md | sed "s\>>>$\\g" > table_files.md
不幸的是,我所有的数据都消失了,它反馈给我一个空白文件。我检查这应该使用-i
适当的选项来完成。
怎么会这样,能恢复数据吗?
文件被覆盖/截断的原因是它是您的shell解释重定向,并且它在任何命令运行之前执行此解释。shell 工作的很大一部分是处理连接各种事物之间的标准输入和标准输出的管道。您发出了如下命令行:
甚至在
command2
运行之前,shell 已经解释了重定向,该重定向会将命令的输出定向到文件,从而截断文件。并且随着文件被截断,没有用于command1
读取的输入,因此它退出,关闭管道到command2
,它也退出,没有发出任何要重定向到文件的数据。看来你有两个问题...
1. 我可以恢复我覆盖的文件吗?
可能不是。如果可以,可以通过恢复备份来完成。用其他数据覆盖文件通常会消除文件的旧版本。
2. 替换文件中数据的最佳方法是什么?
正如您所推测的,使用sed执行此操作的最佳方法是使用
-i
(inplace) 选项。请记住,这并不是真正的就地编辑。该-i
选项使 sed 读取其所有输入,对其进行修改并将其存放在临时存储中,并在完成后将所有内容从临时存储移回原始文件。在 BSD sed(包括 macOS)中:
但是在 GNU sed(大多数 Linux 发行版)中,未指定的 optarg to
-i
被认为是空的:这将删除
>>>
行尾的 。如果要从行内删除字符串,请修改正则表达式,使其不锚定到行尾 ($
),并添加g
标志以使其适用于每行的多个字符串:请注意,不同的操作系统以不同的方式运行 sed。当您编写可能想要共享的工具时,请务必记住,并非每个人都与您运行相同的操作系统。便携性很重要。为了使事情可移植,您可能必须简化您的脚本,以便它们使用您想要支持的所有平台上可用的功能的“最低公分母”。因此: