我正在从多个文件中删除重复的文本行。我尝试使用的命令是
sed -i 's/set autologout=10//g' /home/$x/.login
当我运行它时,我收到此错误
sed: -I or -i may not be used with stdin
该命令在没有该选项的情况下成功运行-i
,但不会保存它。我正在编写此脚本,因为我正在修改每台服务器上每个帐户的 2 个文件。我可以用一个丑陋的异常来编写这个代码,但我无法保存它。
答案1
@don_crissti 的评论所指的事实是BSD sed 似乎要求一个论据-i
,如果-e
不使用,则将第一个参数作为sed
命令。这不会为输入文件留下任何内容,默认为stdin
,并且您无法“就地”编辑该文件。
这与说相反,GNU sed,带有-i
可选参数。
或者换句话说,您sed
可能将 解释s/set autologout=10//g
为 的参数-i
,即用于备份文件的扩展名。因此,如果您不想保留备份文件,只需为该-i
选项提供一个空参数即可:
sed -i "" 's/set autologout=10//g' /home/$x/.login
答案2
对于 POSIX 解决方案,您可以在 Ex 模式下使用 Vim:
ex -sc '%s/set autologout=10//g|x' /home/"$x"/.login
%
选择所有行|
命令分隔符x
如果已进行更改(已更改)则写入文件并退出"$x"
在这种情况下,不加引号的变量是不好的