【问题标题】:Bash - Deleting a line from file using sedBash - 使用 sed 从文件中删除一行
【发布时间】:2016-11-23 01:58:31
【问题描述】:

可能是一个非常直截了当的问题,但我对 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

知道我在这里缺少什么吗?

谢谢

【问题讨论】:

  • 您是否收到类似sed: no input filessed: -i may not be used with stdin 的错误消息?如果是这样,将其添加到问题中会很有帮助。
  • 嗨,是的,在擦除 txt 文件的同时,它还通过说“sed:无输入文件”来完成我已经研究了几个小时并尝试了参数格式的许多变体,但无法让它工作正确。
  • 从命令中删除>

标签: bash sed


【解决方案1】:

sed -i 没有输出,所以当你重定向到一个文件时,它只会被截断。

相反,直接将文件名提供给 sed 而无需重定向:

sed -i "/$logline/d" /root/file.txt

【讨论】:

  • 您好,我刚刚尝试过此更改,但现在我收到错误消息:sed: -e expression #1, char 0: no previous regular expression
  • @William 这意味着$logline 是空的
  • 我尝试添加一个新行 echo $logline 这会输出我期望的“/root/testDir”作为示例,但仍然显示来自 sed 的错误..
  • //root/testDir/d 不是有效的 sed 命令。您可以使用sed -i "\\@$logline@d" 来允许在$logline 中使用/,但不能使用@。您可以通过使用 grep -F 而不是 sed 来避免此类转义/注入问题,如其他答案中所建议的那样
  • 酷。这似乎成功了!我是 bash 的新手,所以感谢您的帮助
【解决方案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"
    

【讨论】:

  • 我是 bash 的新手,所以可能也会出于学习目的考虑这个问题。然而,另一个答案中代码的细微变化已经对其进行了排序,并且似乎正在工作。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2010-09-25
  • 2011-12-15
  • 2023-03-05
  • 1970-01-01
  • 2018-08-25
  • 2023-03-30
相关资源
最近更新 更多