删除具有特定模式的行

删除具有特定模式的行

我想删除具有特定模式的线条。

-rw-rw-r-- 1 user1 user1   10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw------- 1 user1 user1    0 Oct 27 11:17 ./folder1/folder2/.test-file1-228783-cause1-XY-OP-0001.pdf.lyWfRr
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw------- 1 user1 user1    0 Oct 27 11:19 ./folder1/folder2/.test-file3-228706-cause1-XY-OP-0005.pdf.GftyJL
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

从上面的行集中,想要删除下面的行

-rw------- 1 user1 user1    0 Oct 27 11:17 ./folder1/folder2/.test-file1-228783-cause1-XY-OP-0001.pdf.lyWfRr
-rw------- 1 user1 user1    0 Oct 27 11:19 ./folder1/folder2/.test-file3-228706-cause1-XY-OP-0005.pdf.GftyJL

你能告诉我怎么做吗?

谢谢

答案1

我假设此文本存储在一个文件中,比如说ls_l_out.txt

我不知道您希望如何完成模式匹配,但我认为最简单的事情就是匹配权限。

因此,考虑到这一点,您可以使用这个 sed 命令:

$ sed '/^-rw-------/d' ls_l_out.txt
-rw-rw-r-- 1 user1 user1   10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

如果您运行该程序并且输出看起来不错,那么您可以使用 sed 标志来就地编辑该文件-i

$ sed -i '/^-rw-------/d' ls_l_out.txt

答案2

从您的输出可以看出您运行了命令

$ ls -la ./folder1/folder2/

或类似的东西,你的问题要求解析的输出ls。然而,你真的不应该解析 ls,因为出于多种原因,这种做法很糟糕。更好的方法是这样的:

$ ls ./folder1/folder2/{"",.}test*pdf

路径名扩展将仅抓取以 开头test和结尾的文件pdf,这些文件可能以点开头,也可能不以点开头。以 结尾的文件 lyWfRr不会GftyJL以这种方式显示。


但是,如果你坚持要解析该输出,请使用$anchor inawk过滤掉仅以.pdf

$ awk '/pdf$/' input.txt                                                                                                                                               
-rw-rw-r-- 1 user1 user1   10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

需要说明的是,我并不赞同这种做法,我鼓励用户避免ls解析,并以正确的方式做事TM

答案3

虽然当前的答案是有效的,但是如果您要处理大量文件(超过 30k),它们可能会有问题。在这种情况下,我建议改用 find:

find ./folder1/folder2 -maxdepth 0 -type f -name ".test-file*-*-cause1-XY-OP-*.pdf.*" -delete

编辑:我假设您想删除文件而不是更新文件的内容。在这种情况下,使用 sed、awk 或 grep 是唯一的选择,因此您应该避免这个答案。

相关内容