我正在使用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
答案 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)
你现在拥有的是一种非常危险的方法。当您需要字符串时,您正在使用正则表达式,并且您在整个行中匹配而不是特定字段。
备份您的文件,然后在用户为两个输入输入.*
时尝试。现在尝试输入King
和2
。我猜这些不是理想的结果。
你应该真正使用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