任何人都知道 perl one liner 可以删除文件中的单词,例如我有以下内容,它在 linux 上不起作用
$ ssh root\@$host perl -p -e 's/value1/ /' -e 's/value2/ /' /tmp/file
答案1
如果您想更改 的内容/tmp/file
,而不是仅在标准输出上显示修改后的输出,您需要使用perl
的-i
选项来“就地”编辑文件。查看man perlrun
并搜索-i
详细信息。
另外,在使用变量时引用它们(例如$host
)。
顺便说一句,您正在将两种不同的模式更改为相同的值(空格)。这不需要两个单独的s///
操作。
ssh "root@$host" perl -p -i -e 's/value1|value2/ /' /tmp/file
即使您确实需要两个不同的操作,也可以用分号 ( ;
) 将它们分开。
ssh "root@$host" perl -p -i -e 's/value1/foo/;s/value2/bar/' /tmp/file
如果要制作原始文件的备份副本,-i
请使用可选后缀。例如
ssh "root@$host" perl -p -i.bak -e 's/value1|value2/ /' /tmp/file
/tmp/file
/tmp/file.bak
将在被 perl 编辑之前被复制到。
您可以使用 来同样轻松地完成此操作,并且速度稍快(可能不明显,除非在循环中运行多次),sed
它也有一个等效的-i
选项。
从man sed
:
-i[后缀], --in-place[=后缀]
就地编辑文件(如果提供了后缀,则进行备份)
ssh "root@$host" sed -i -e 's/value1\|value2/ /' /tmp/file
或使用 sed 的-E
扩展正则表达式 (ERE) 选项
ssh "root@$host" sed -i -E -e 's/value1|value2/ /' /tmp/file
顺便说一句,您可以像在 perl 中一样使用 a 分隔多个 sed 命令;
。