我有一个包含名称的文本文件。我希望我的程序能够删除我指定的名称。
首先,我发现我可以用来实现这一点sed
,但是它对我来说不起作用。
deletename
是我的变量,它将包含我想要用于搜索的模式,并且test.txt
是我的文本文件。
我在用:
deletename=0; read deletename; sed...
我努力了:
sed "/$deletename/ d" test.txt
sed "/$deletename/d" test.txt
sed '/$deletename/ d' test.txt
sed '/$deletename/d' test.txt
sed -e "/$deletename/ d" test.txt
sed -e "/$deletename/d" test.txt
sed -e '/$deletename/ d' test.txt
sed -e '/$deletename/d' test.txt
sed -r "/$deletename/ d" test.txt
sed -r "/$deletename/d" test.txt
sed -r '/$deletename/ d' test.txt
sed -r '/$deletename/d' test.txt
由于这些都不起作用,我想到了一个主意,检查包含该模式的行号,然后删除该行。我知道我应该使用grep
,但我完全不知道该如何使用它。
我尝试过这样的事情,但没有效果:
lineno=`expr grep -n $deletename test.txt`
有人能帮忙吗? 对我来说,用sed
或grep
都无所谓。
答案1
如果您想要使用read
传递名称,并且想要删除包含名称的行:
read deletename; sed "/$deletename/d" test.txt
然后按enter并read
等待您输入内容,因此请输入您想要的任何内容deletename
,例如0
,然后enter再次按 并sed
执行命令。 的内容test.txt
将出现在终端中,但所有包含0
或您输入的任何内容的行都将从流中删除(而不是从文件中删除)
如果你只想删除名称本身,可以这样做:
read deletename; sed "s/$deletename//g" test.txt
如果您随后输入0
,则每个实例0
都将被删除。
您可以将tee
输出重定向(或)到新文件,或者如果你想就地修改文件,使用-i
标志(经过测试)
read deletename; sed -i "/$deletename/d" test.txt
在这种情况下,您将看不到任何输出;更改将被写入文件而不是显示在终端上(在 STDOUT 上)。
您需要使用双引号来允许参数扩展,因为单引号会抑制它。但我认为最正确的方法是,虽然在这个简单的情况下没有必要,但它是在表达式的其他部分周围使用单引号并正常引用变量:
sed 's/'"$deletename"'//g' test.txt
答案2
过滤行是 的主要作用grep
。使用-v
switch 反转匹配,即仅显示不包含文本的行。因此,您可以使用以下命令:
read deletename; grep -v $deletename test.txt