Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何在Unix中查找和删除文件中的行?_File_Unix_Find_Line - Fatal编程技术网

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

File 如何在Unix中查找和删除文件中的行?,file,unix,find,line,File,Unix,Find,Line,我有一个文件(例如: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),并在

我有一个文件(例如: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),并在这个文件中删除我的行。但这不是我想要的。

这里有一个使用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

根据您在文本中的描述,这里是一个sed脚本的清理版本,应该可以正常工作

假设使用linux GNU

sed -i '/abcd=/d' /test.txt 
如果您使用的是OS-X,那么您需要

sed -i "" '/abcd=/d' /test.txt 
如果这些不起作用,那么使用老式的
sed
和有条件的mv来管理您的tmpfiles

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 

我希望这会有所帮助。

据我所知,此命令可用于创建具有已删除行的其他文件。现在我们有了另一个文件,如果需要,可以重命名该文件并删除原始文件。 你必须这样做

       grep -v '^\$abcd=' test.txt > tmp.txt
现在tmp.txt将有内容

a
b
ab
ac
$abcd
ab
a
x

如果需要,可以在删除test.txt后将其重命名为test.txt。txt将由shell解析$abcd。如果未定义该shell变量,它将从参数中有效地“删除”。这将使您的sed调用
\“/=/d\“
并为所有包含
=
的行干杯。奇怪,在我的行中效果很好。也许这里使用的是不同版本的GNU grep。。。