Bashから一致しない行を削除する

Bashから一致しない行を削除する

以下を含むテキストファイルがあります。

Today, 12:34https://...
Today, 12:43https://...
Yesterday, 13:21https://...
Nottoday, 12:32https://

「今日」または「昨日」と一致しないすべての行を削除しようとしています。

このフォーラムでモードが1つしかないsedコマンドを見つけ、「today」行のみを含むテキストファイルに対して次のことを試みました。

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と一致しないすべての行を削除するには、YesterdayEdエディタを使用できます。

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

v逆方向グローバルコマンドなので、一致しないか削除された行はすべてd削除されます。変更を作成して終了します。 Edのフラグはサイレントモードで実行されます。TodayYesterdaywq-s

-iフラグと一緒にSedを使用することもできます。

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他の言語のnext/と同じ)、パターンスペースも削除されます(最終的には印刷されません)。したがって、orを含む行を除くすべての行を削除します。continued dYesterdayToday

または以下を使用してくださいperl(実装-iの一部を借りるsed)。

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

基準基本的なsedorで使用される正規表現には代替演算子はedありませんが、いくつかの実装では代替演算子に切り替える必要があります。|sed-E拡大するsed正規表現(このオプションは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の2つの方法で完了しました

注文する

 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:

関連情報