![删除 bash 中不匹配的行](https://linux22.com/image/179567/%E5%88%A0%E9%99%A4%20bash%20%E4%B8%AD%E4%B8%8D%E5%8C%B9%E9%85%8D%E7%9A%84%E8%A1%8C.png)
我有一个文本文件包含
Today, 12:34https://...
Today, 12:43https://...
Yesterday, 13:21https://...
Nottoday, 12:32https://
并想删除所有与“今天”或“昨天”不匹配的行。
我在这个论坛中找到了一个只有一种模式的 sed 命令,并针对仅包含“今日”行的文本文件尝试了以下命令:
sed -n '/Yesterday/p' file.txt
或者
sed '/Yesterday/!d' file.txt
但它不会删除任何东西。你能帮我看看如何消除所有不包含“今天”或“昨天”的行吗?
答案1
Sed 不会修改您的文件(除非给出标志-i
,对于提供它的实现)。它读取文件并写入标准输出,如下所示。
$ sed -n '/Yesterday/p' file.txt
Yesterday, 13:21https://...
$ cat file.txt
Today, 12:34https://...
Today, 12:43https://...
Yesterday, 13:21https://...
Nottoday, 12:32https://
要删除所有不匹配Today
Nor 的行Yesterday
,您可以使用 Ed 编辑器。
printf '%s\n' 'v/Today\|Yesterday/d' w q | ed -s file.txt
v
是反向全局命令,因此d
删除所有不匹配Today
或 的行Yesterday
。w
写入更改并q
退出。 Ed 的标志-s
以静默模式运行它。
您还可以将 Sed 与-i
标志一起使用,
sed -n -i '/Yesterday\|Today/p' file.txt
答案2
要使用 就地编辑文件sed
,您需要非标准-i
选项:
# GNU syntax à la perl (now also in busybox, NetBSD, OpenBSD):
sed -i -e /Yesterday/b -e /Today/b -e d your-file
# FreeBSD syntax (also in derivatives like macOS):
sed -i '' -e /Yesterday/b -e /Today/b -e d your-file
该b
sed
命令b
ranches out(相当于其他语言中的next
/ ),同时删除模式空间(最终不会被打印)。因此,我们删除除包含或 的行以外的所有行。continue
d
d
Yesterday
Today
或者使用perl
(借用了其-i
一些sed
实现):
perl -i -ne 'print if /(Yester|To)day/' your-file
标准基本的sed
or使用的正则表达式ed
没有|
交替运算符,但是有几个sed
实现需要-E
切换到扩展sed
正则表达式(该选项也将出现在(not )的 POSIX 规范的下一版本中ed
)。
sed -Ei '/(Yester|To)day/!d' your-file
GNU 实现sed
还支持\|
在其基本正则表达式中作为交替运算符(不带-E
/ -r
):
sed -i '/\(Yester\|To\)day/!d' your-file
答案3
通过 awk 和 python 两种方法完成
命令
awk '!/Today|Yesterday/' filename
输出
Nottoday, 12:32https:
Python
#!/usr/bin/python
import re
h=re.compile(r'Today|Yesterday')
k=open('p','r')
for i in k:
if not re.search(h,i):
print i.strip()
输出
Nottoday, 12:32https: