我正在尝试使用sed
从名称存储在变量中的文件中删除一行,从用户输入读取。现在所有sed
都打印了该行,没有别的。
这是我正在使用的命令的代码片段:
FILE="/home/devosion/scripts/files/todo.db"
read DELETELINE
sed -e "$DELETELINE"'d' "$FILE"
我在这里缺少什么?
修改:使用-e
切换-i
选项修复了我的困境!
答案 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"
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.