如何从文件中删除具有特定字符串的行

如何从文件中删除具有特定字符串的行

请注意这样的文本文件:

/home/user1/dir1
/home/user1/dir2
/home/user1/
/home/user1/dir1/dir11

目标是删除只有“/home/user1/”的行,除此之外什么都没有,所以最终结果应该是:

/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

尝试使用下面的代码,但它删除了其中包含 /home/user1/ 的所有行。知道应该如何做吗?

grep -v "/home/user1/" /home/user1/input.txt > tmpfile && mv tmpfile /home/user1/output.txt

答案1

使用锚点来标记行的开头和结尾:^用于开头和$结尾。所以事情会是这样的:

$ grep -v '^/home/user1/$' file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

或者,您可以使用以下-x选项:

-x, --line-regexp         match only whole lines

然后

$ grep -vx '/home/user1/' file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

你的grep命令正在做它应该做的事情,找到所有符合的行包含 /home/user1/,不完全匹配。

答案2

如果sed是一个选项

$ sed -n '\|\(/\([^/]*/\)\{2\}\)\<|p' input_file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

答案3

如果这就是文件的确切内容,那么这里有一个使用 GNU 的简单解决方案sed

sed '/^\/home\/user1\/$/d' file

^标记行的开头并$标记行的结尾,因此它只会匹配该确切的字符串。\用于转义/字符串中的实例。

如果字符串行包含尾随空格,则可以使用此方法:

sed '/^\/home\/user1\/[[:space:]]*$/d' file

输出:

/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11

一旦您确定它满足您的要求,请添加-i以就地编辑文件:

sed -i '/^\/home\/user1\/$/d' file

sed -i '/^\/home\/user1\/[[:space:]]*$/d' file

相关内容