删除包含变量的行

删除包含变量的行

我有一个包含名称的文本文件。我希望我的程序能够删除我指定的名称。

首先,我发现我可以用来实现这一点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`

有人能帮忙吗? 对我来说,用sedgrep都无所谓。

答案1

如果您想要使用read传递名称,并且想要删除包含名称的行:

read deletename; sed "/$deletename/d" test.txt

然后按enterread等待您输入内容,因此请输入您想要的任何内容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。使用-vswitch 反转匹配,即仅显示不包含文本的行。因此,您可以使用以下命令:

read deletename; grep -v $deletename test.txt

相关内容