特定の文字列を含むテキストファイルのすべての行を削除するには、sedをどのように使用しますか?
特定の文字列を含むテキストファイルのすべての行を削除するには、sedをどのように使用しますか?
回答:
行を削除して、出力を標準出力に出力するには、次のようにします。
sed '/pattern to match/d' ./infile
ファイルを直接変更するには– BSD sedでは機能しません:
sed -i '/pattern to match/d' ./infile
同じですが、BSD sed(Mac OS XおよびFreeBSD)の場合– GNU sedでは機能しません。
sed -i '' '/pattern to match/d' ./infile
ファイルを直接変更する(およびバックアップを作成する)には、BSDおよびGNU sedで動作します。
sed -i.bak '/pattern to match/d' ./infile
sed '/pattern to match/d' ./infile > ./newfile
または、インプレース編集を行う場合は、のように-i
フラグをsedに追加できますsed -i '/pattern to match/d' ./infile
。この-i
フラグはGNU sedを必要とし、移植性がないことに注意してください
sed -i.backup '/pattern to match/d' ./infile
)これにより、インプレース編集が可能になりました。
sed
ことに、バージョン管理されていないファイルにコマンドを適用しないでください。
sed -i '' '/pattern/d' ./infile
。
他にも特定の文字列を含む行を削除する方法は他にもたくさんあります sed
:
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
while read -r line
do
[[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file
grep -v "pattern" file > temp && mv temp file
そしてもちろんsed
(逆を印刷することは実際の削除よりも高速です):
sed -n '/pattern/!p' file
sed
例では動作が異なります。それはのようなものでなければなりません sed -n -i '/pattern/!p' file
。
grep -v "pattern" file > temp; mv temp file
これは、戻り値によっては、他のいくつかの例に適用される場合があります。
seq -f %f 10000000 >foo.txt
。sed d:time sed -i '' '/6543210/d' foo.txt
実際の0m9.294s。sed!p:time sed -i '' -n '/6543210/!p' foo.txt
実数0m13.671s。(ファイルが小さいほど、その差は大きくなります。)
sedを使用して、ファイル内の所定の行を置き換えることができます。ただし、grepを使用して2番目のファイルにインバースし、2番目のファイルを元のファイルに移動するよりもはるかに遅いようです。
例えば
sed -i '/pattern/d' filename
または
grep -v "pattern" filename > filename2; mv filename2 filename
とにかく、最初のコマンドは私のマシンで3倍長くかかります。
sed '/pattern/d' filename > filename2; mv filename2 filename
GNUでそれを行う簡単な方法sed
:
sed --in-place '/some string here/d' yourfile
-r
オプションを試してください(または-E
、バージョンによっては)。これは、正規表現のメタ文字の使用を可能にし+
、?
、{...}
と(...)
。
ex
(標準のUnixコマンドベースのエディターである)の使用を検討してください。
ex +g/match/d -cwq file
どこ:
+
指定されたExコマンド(man ex
)-c
を実行します。実行wq
(書き込みと終了)と同じです。g/match/d
-指定されたmatch
で行を削除するexコマンド、参照:Power of g上記の例は、Unix.SEおよびのPOSIX仕様のex
この投稿に従ってファイルをインプレース編集するためのPOSIX準拠の方法です。
との違いsed
は次のとおりです。
sed
あるS tream ED itor、ないファイルエディタが。BashFAQ
移植性のないコード、I / Oオーバーヘッド、およびその他のいくつかの悪い副作用を楽しんでいない限り。そのため、基本的に一部のパラメーター(in-place /など-i
)は非標準のFreeBSD拡張であり、他のオペレーティングシステムでは使用できない場合があります。
man ex
それをするときに私に男を与えるときvim
、それex
はvimの一部のようです...もし私が正しく理解すれば、パターン構文match
がvimregex.comであることを意味します。
私はMacでこれに苦労していました。さらに、変数置換を使用してそれを行う必要がありました。
だから私は使用しました:
sed -i '' "/$pattern/d" $file
どこ$file
で削除が必要なファイルであり、$pattern
削除のために一致するパターンですが。
私は''
このコメントから選びました。
ここで注意すべき事はの使用である二重引用符の中で"/$pattern/d"
。単一引用符を使用すると、変数は機能しません。
sed
後にパラメータを必要とし-i
、バックアップをしたくないのであれば、あなたはまだ空の文字列を追加する必要があります:-i ''
sed -i "/$pattern/d" $file
。お返事ありがとうございます。
約345 000行を含むファイルで小さなベンチマークを作成しました。との道はgrep
約15倍速いようですsed
方法は、この場合の方法ようです。
LC_ALL = Cの設定ありとなしの両方を試しましたが、タイミングが大幅に変更されていないようです。検索文字列(CDGA_00004.pdbqt.gz.tar)は、ファイルの途中にあります。
コマンドとタイミングは次のとおりです。
time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt
real 0m0.711s
user 0m0.179s
sys 0m0.530s
time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt
real 0m0.105s
user 0m0.088s
sys 0m0.016s
time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )
real 0m0.046s
user 0m0.014s
sys 0m0.019s
これを使用することもできます:
grep -v 'pattern' filename
ここで-v
は、パターン(つまり、反転一致)以外のみが印刷されます。
文字列の完全一致に対して誰かがそれを実行したい場合に備えて-w
、grep-w全体でフラグを使用できます。つまり、たとえば、番号が11の行を削除し、番号が111の行は保持する場合は、次のようにします。
-bash-4.1$ head file
1
11
111
-bash-4.1$ grep -v "11" file
1
-bash-4.1$ grep -w -v "11" file
1
111
-f
複数の正確なパターンを一度に除外したい場合も、フラグと連携します。「ブラックリスト」が、「ファイル」から削除する各行にいくつかのパターンがあるファイルの場合:
grep -w -v -f blacklist file
-w, --word-regexp Select only those lines containing matches that form whole words.
対-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
cat filename | grep -v "pattern" > filename.1
mv filename.1 filename
処理されたテキストをコンソールに表示するには
cat filename | sed '/text to remove/d'
処理されたテキストをファイルに保存するには
cat filename | sed '/text to remove/d' > newfile
処理されたテキスト情報を既存のファイルに追加する
cat filename | sed '/text to remove/d' >> newfile
既に処理されたテキストを処理するには、この場合、削除されたものの行をさらに削除します
cat filename | sed '/text to remove/d' | sed '/remove this too/d' | more
| more
一度に1ページのチャンク内のテキストが表示されます。