如何删除sed中带变量的行?

时间:2016-02-02 15:37:28

标签: linux bash sed

我正在尝试使用sed从名称存储在变量中的文件中删除一行,从用户输入读取。现在所有sed都打印了该行,没有别的。

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

FILE="/home/devosion/scripts/files/todo.db"
read DELETELINE
sed -e "$DELETELINE"'d' "$FILE"

我在这里缺少什么?

修改:使用-e切换-i选项修复了我的困境!

4 个答案:

答案 0 :(得分:2)

您需要划分搜索。

#!/bin/bash

read -r Line

sed "/$Line/d" file

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

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

另外请记住,当变量扩展时,它不能包含分隔符,否则命令会中断或有未解决的结果。

例如,如果" $ Line"包含" /你好"然后sed命令将失败 sed: -e expression #1, char 4: extra characters after command

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

我个人会使用awk这个

awk -vLine="$Line" '!index($0,Line)' file

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

答案 1 :(得分:1)

您可能使用grep而不是sed

取得了成功
read -p "Enter a regex to remove lines: " filter
grep -v "$filter" "$file"

就地存储需要多做一些工作:

tmp=$(mktemp)
grep -v "$filter" "$file" > "$tmp" && mv "$tmp" "$file"

sponge

grep -v "$filter" "$file" | sponge "$file"

注意:尽量避免使用ALLCAPSVARS的习惯:有一天你会accidentally use PATH=... and then wonder why your script is broken

答案 2 :(得分:0)

请试试这个:

sed -i "${DELETELINE}d" $FILE

答案 3 :(得分:0)

我发现了这一点,它允许使用变量进行范围删除:

#!/bin/bash

lastline=$(whatever you need to do to find the last line)` //or any variation

lines="1,$lastline"

sed -i "$lines"'d' yourfile

keeps it all one util.