可能是一个相当直接的人,但我对bash相当新 我试图从包含特定字符串的.txt文件中删除一行。该字符串被指定为变量" $ logline"
我的sed代码目前是:
logline="example2"
sed -i "/$logline/d" > /root/file.txt
/root/file.txt
文件的内容是......
/root/Dir/example.txt
/root/Dir2/example2.txt
/root/Dir/example3.html
...
我希望删除行/root/Dir2/example2.txt
。
然而,当我运行这个时,整个txt文件都被擦除了,我收到错误消息sed: no input files
。
知道我在这里失踪的是什么吗?
由于
答案 0 :(得分:2)
sed -i
没有输出,因此当您重定向到文件时,它将被截断。
相反,直接将文件名设置为sed而不重定向:
sed -i "/$logline/d" /root/file.txt
答案 1 :(得分:2)
如果变量$logline
包含要匹配的确切文字,则sed可能是错误的程序。模式地址是正则表达式,您需要转义基本RE中理解的任何元字符,包括\
,*
和.
。
要删除固定字符串,您可能会发现使用grep -Fv
更容易;
grep -Fv -- "$logline" <"$file" >"$file.new"; mv "$file.new" "$file"
如果你真的必须使用sed,你应该选择使用-i
或使用标准输出进行就地编辑 - 你不能同时使用它们。所以要么
sed -i "/$logline/d" "$file"
sed "/$logline/d" "$file" >"$file.new" && mv "$file.new" "$file"