2012-03-22 10 views
3

私は1つのファイル(例えば:test.txt)を持っていますが、このファイルにはいくつかの行が含まれています。例えば、次の行は1行です:abcd = 11 例:abcd = 12 番号は異なりますがabcd =いずれの場合も同じですから、誰も私にこの行を見つけてそれを削除する命令を与えることができますか?Unixのファイルから行を見つけて削除するには?

私が試してみました:sed -e \"/$abcd=/d\" /test.txt >/test.txtが、それは私のファイルからすべての行を削除し、私も試してみました:sed -e \"/$abcd=/d\" /test.txt >/testNew.txtが、それはあるtest.txtから行を削除しません、それだけで、このファイルに新しいファイル(testNew.txt)とを作成し、それは私の行を削除します。しかし、それは私が望むものではありません。ここで

+1

$ ABCDのあるtest.txt削除した後test.txtのためにこの名前を変更することが必要な場合tmp.txt内容

a b ab ac $abcd ab a x 

を持つことになり、今この

 grep -v '^\$abcd=' test.txt > tmp.txt 

を行う必要がありますシェルによって解析される予定です。そのシェルvarが定義されていないと、引数から効果的に "削除"されます。それはあなたのsed呼び出しを '\"/=/d \ "'にし、 '='を持つすべての行をトーストします。 –

答えて

9

テキストであなたの説明に基づいて、ここに動作するはずあなたのsedスクリプトのクリーンアップバージョンです。 LinuxではGNUあなたがOS-Xを使用している場合、これらはと古い学校sedを使用し、その後、動作しない場合は、あなたが

sed -i "" '/abcd=/d' /test.txt 

が必要

sed -i '/abcd=/d' /test.txt 

をsedを想定すると

あなたのtmpファイルを管理する条件付きmv。

sed '/abcd=/d' /test.txt > test.txt.$$ && /bin/mv test.txt.$$ test.txt 

注:なぜあなたは\"/$abcd=/d\"をやっている

わからないあなたは、このコードでより多くのをやっていない限り、あなたは(evalを使用してのような)を示しているよりも"文字をエスケープする必要はありません。 "/$abcd=/d"と書いてください。

通常は

あなたが本当に使いたい場合は「-e」をABCD = 『「あなたは文字列に一致しているとして$ ABCDを、その後、あなたはそれに価値を与える必要がありAND』必要はありません。できます

abcd='abcd=' 
sed -i "/${abcd}/d" /test.txt 

私はこれが役に立ちそうです。

0

はグレップを使用してソリューションです:概念の

$ grep -v '^\$abcd=' test.txt 

証明:

$ cat test.txt 
a 
b 
ab 
ac 
$abcd=1 
$abcd=2 
$abcd 
ab 
a 
$abcd=3 
x 

$ grep -v '^\$abcd=' test.txt 
a 
b 
ab 
ac 
$abcd 
ab 
a 
x 
+0

それは動作しません、私のファイルからその行を削除しません。 – Adam

+0

奇妙な、私の上でうまく働いた。おそらく、GNU grepの異なるバージョンがここで使用されています... – AlG

0

私が知る限り、このコマンドを使用して、削除された行を持つ他のファイルを作成することができます。これで別のファイルが作成できたので、そのファイルの名前を変更して元のファイルを削除することができます。 あなたはただあなたが

関連する問題