删除 bash 中不匹配的行

删除 bash 中不匹配的行

我有一个文本文件包含

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://

要删除所有不匹配TodayNor 的行Yesterday,您可以使用 Ed 编辑器。

printf '%s\n' 'v/Today\|Yesterday/d' w q | ed -s file.txt

v是反向全局命令,因此d删除所有不匹配Today或 的行Yesterdayw写入更改并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命令branches out(相当于其他语言中的next/ ),同时删除模式空间(最终不会被打印)。因此,我们删除除包含或 的行以外的所有行。continued dYesterdayToday

或者使用perl(借用了其-i一些sed实现):

perl -i -ne 'print if /(Yester|To)day/' your-file

标准基本的sedor使用的正则表达式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:

相关内容