请注意这样的文本文件:
/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