如何在Unix中查找和删除文件中的行?

5
我有一个文件(test.txt),其中包含多行文本,例如其中一行是:abcd=11。但是也可能是:abcd=12。数字不同,但是在所有情况下,abcd=是相同的。请问是否有命令可以找到并删除这一行?
我尝试过以下命令:sed -e \"/$abcd=/d\" /test.txt >/test.txt,但它会删除文件中的所有行。我还尝试过:sed -e \"/$abcd=/d\" /test.txt >/testNew.txt,但它并不会从test.txt中删除该行,而只是创建了一个新文件(testNew.txt),并在其中删除了我的行。但这不是我想要的结果。

1
$abcd将被shell解析。如果该shell变量未定义,则它将从参数中有效地“删除”。这将使您的sed调用\"/=/d\"并烤掉所有包含=的行。 - Marc B
3个回答

12

根据您在文本中的描述,以下是一个经过清理的sed脚本版本,应该可以工作。

假设是在linux GNU sed上运行。

sed -i '/abcd=/d' /test.txt 
如果你使用的是OS-X系统,那么你需要:
sed -i "" '/abcd=/d' /test.txt 
如果这些方法都无法解决问题,那么可以使用老派的sed命令,并使用条件移动命令来管理临时文件。
sed '/abcd=/d' /test.txt > test.txt.$$ && /bin/mv test.txt.$$ test.txt

注意:

不确定你为什么要做\"/$abcd=/d\",除非你在这段代码中执行更多操作(如使用eval),否则你不需要转义"字符。只需将其写为"/$abcd=/d"

通常不需要使用'-e'

如果你真的想使用'$abcd',那么你需要给它一个值并且由于你匹配的是字符串'abcd=',所以你可以写成

 abcd='abcd='
 sed -i "/${abcd}/d" /test.txt 

希望这可以帮到你。


0

这里有一个使用grep的解决方案:

$ grep -v '^\$abcd=' test.txt

概念验证:

$ cat test.txt
a
b
ab
ac
$abcd=1
$abcd=2
$abcd
ab
a
$abcd=3
x

$ grep -v '^\$abcd=' test.txt
a
b
ab
ac
$abcd
ab
a
x

在我的电脑上很正常。也许这里使用了不同版本的GNU grep... - AlG

0
据我所知,此命令可用于创建另一个文件并删除其中的行。现在我们有了另一个文件,如果需要,我们可以将该文件重命名并删除原始文件。 你只需要这样做。
       grep -v '^\$abcd=' test.txt > tmp.txt

现在 tmp.txt 将会有内容

a
b
ab
ac
$abcd
ab
a
x

如果你想要的话,可以在删除test.txt后将其重命名为test.txt


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接