如何删除sed中给定变量的行?

bar*_*fly 7 linux bash sed

我试图用来sed删除从用户输入中读取的行,从名称存储在变量中的文件中读取。现在sed所做的就是打印该行,而没有其他任何事情。

这是我正在使用的命令的代码片段:

FILE="/home/devosion/scripts/files/todo.db"
read DELETELINE
sed -e "$DELETELINE"'d' "$FILE"
Run Code Online (Sandbox Code Playgroud)

有什么我在这里想念的吗?

编辑:切换-e选项-i解决了我的问题!

123*_*123 6

您需要界定搜索范围。

#!/bin/bash

read -r Line

sed "/$Line/d" file
Run Code Online (Sandbox Code Playgroud)

将删除包含键入的输入的任何行。

请记住,sed 在正则表达式上匹配,任何特殊字符都将被视为如此。
例如,搜索1*实际上会删除包含任意数量的 1 的行,而不是实际的 1 和星号。

另请记住,当变量扩展时,它不能包含分隔符,否则命令将中断或产生未扩展的结果。

例如,如果“$Line”包含“/hello”,那么 sed 命令将失败并显示 sed: -e expression #1, char 4: extra characters after command.

在这种情况下,您可以转义/或使用不同的分隔符。

就我个人而言,我会为此使用 awk

awk -vLine="$Line" '!index($0,Line)' file
Run Code Online (Sandbox Code Playgroud)

它搜索精确的字符串并且没有 sed 命令的缺点。

  • 使用 bash,您可以遍历牙签森林:`sed "/${Line//\//\\/}/d" file` 来转义参数中的任何斜杠。但建议使用字符串比较函数而不是正则表达式+1。 (2认同)