sed无法从文件中删除

时间:2015-01-10 15:19:11

标签: ubuntu sed

我正在使用ubuntu shell;我想读取用户输入并删除文件中的行。但是,当我运行它时,终端显示删除后的所有数据,但我的文件保持不变,没有删除。我怎么忽略sed的情况?

数据:

The Small:Sir King:23.0:30:5
The Big:Sir King:28.0:40:7
The Middle:Sir King:98.9:20:8

代码:

echo "Please enter data1: "
read data1
echo "Please enter data2: "
read data2
sed "/$data1:$data2/d" sampleDB.txt

当我输入The Middle时,Sir Sir会在终端显示:

The Small:Sir King:23.0:30:5
The Big:Sir King:28.0:40:7

但我的文件仍有The Middle:Sir King:98.9:20:8

4 个答案:

答案 0 :(得分:1)

使用-i选项在文件中执行sed replace inplace:

sed -i "/$data1:$data2/d" sampleDB.txt

如果您希望在修改文件之前创建备份原始文件,请将其用作:

sed -i.bak "/$data1:$data2/d" sampleDB.txt

现在您将有其他文件sampleDB.txt.bak没有任何修改,原始文件sampleDB.txt删除了行。

答案 1 :(得分:0)

你现在拥有的是一种非常危险的方法。当您需要字符串时,您正在使用正则表达式,并且您在整个行中匹配而不是特定字段。

备份您的文件,然后在用户为两个输入输入.*时尝试。现在尝试输入King2。我猜这些不是理想的结果。

你应该真正使用awk,因为它可以使用字符串比较在特定字段上操作,因此解决了这两个问题:

awk -F: -v d1="$data1" -v d2="$data2" '!($1==d1 && $2==d2)' sampleDB.txt > tmp &&
mv tmp sampleDB.txt

忽略大小写:

awk -F: -v d1="$data1" -v d2="$data2" '!(tolower($1)==tolower(d1) && tolower($2)==tolower(d2))' sampleDB.txt > tmp &&
mv tmp sampleDB.txt

使用GNU awk,如果您愿意,可以使用IGNORECASE-i inplace使其更简洁,请参阅手册页。

答案 2 :(得分:0)

而不是

sed "/$data1:$data2/d" sampleDB.txt

sed -i "/$data1:$data2/Id" sampleDB.txt

命令行中的I标志将忽略任何大写/小写。

答案 3 :(得分:0)

你应该尝试:

sed "/d${data1}:${data2}" sampleDB.txt