以下を含むテキストファイルがあります。
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://
Today
Norと一致しないすべての行を削除するには、Yesterday
Edエディタを使用できます。
printf '%s\n' 'v/Today\|Yesterday/d' w q | ed -s file.txt
v
逆方向グローバルコマンドなので、一致しないか削除された行はすべてd
削除されます。変更を作成して終了します。 Edのフラグはサイレントモードで実行されます。Today
Yesterday
w
q
-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を含む行を除くすべての行を削除します。continue
d
d
Yesterday
Today
または以下を使用してくださいperl
(実装-i
の一部を借りるsed
)。
perl -i -ne 'print if /(Yester|To)day/' your-file
基準基本的なsed
orで使用される正規表現には代替演算子は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: