2016-11-22 27 views
1

おそらくかなり単純ですが、私はかなり新しいbashです 特定の文字列を含む.txtファイルから行を削除しようとしています。文字列はsedのための私のコードはBash - sedを使ってファイルから行を削除する

変数の「$ logline」として指定されている現在、次のとおりです。

logline="example2" 
sed -i "/$logline/d" > /root/file.txt 

/root/file.txtファイルの内容がされて...

/root/Dir/example.txt 
/root/Dir2/example2.txt 
/root/Dir/example3.html 
... 

私はちょうど期待行/root/Dir2/example2.txtを削除してください。

しかし、これを実行すると、txtファイル全体が消去され、エラーメッセージsed: no input filesが表示されます。

私はここで何が不足していると思いますか?

おかげ

+0

あなたは' sedのようなエラーメッセージを取得しているいずれかの-iはstdin'と一緒に使用することはできませんか?もしそうなら、質問に追加すると便利です。 –

+0

こんにちは はいtxtファイルをワイピングすると同時に「sed:入力ファイルがありません」と言って終了します これを数時間にわたって調べて、さまざまな引数形式を試しましたが、正しく動作させることはできません。 – William

+2

'>'コマンドを削除します。 – Cyrus

答えて

2

sed -iは出力を持っていないので、あなたは、ファイルにリダイレクトするとき、それだけで切り捨てられます。

代わりに、リダイレクトせずに直接sedのためにファイル名を与える:

sed -i "/$logline/d" /root/file.txt 
+0

こんにちは 私はちょうどこの変更を試みましたが、今はエラーが出ています: sed:-e式#1、char 0:前の正規表現なし – William

+0

@Williamこれは '$ logline'が空であることを意味します –

+0

I これは私が例 として 『/ルート/ TESTDIR』として期待するものを出力しますが、まだsedの.. – William

2

あなたの変数$loglineはsedのを一致させる正確なテキストは、おそらく使用する間違ったプログラムで含まれている場合。パターンアドレスは正規表現で、\,*.など、基本REで理解されているメタキャラクタのいずれかをエスケープする必要があります。

固定文字列を削除するには、grep -Fvを使用する方が簡単でしょう。

grep -Fv -- "$logline" <"$file" >"$file.new"; mv "$file.new" "$file" 

のようなもの、あなたが本当にsedを使用する必要がある場合は、あなたが-iとインプレース編集または標準出力を使用しているかどうかを選択する必要があります - あなたは、両方を得ることはありません。無入力files`をまたは `sedを::だから

  • sed -i "/$logline/d" "$file" 
    
  • sed "/$logline/d" "$file" >"$file.new" && mv "$file.new" "$file" 
    
+0

私はbashに新しいので、おそらくこれを学習目的でも調べます。しかし、他の答えからのコードのわずかな変更は、それをソートして動作しているようです。 ご協力いただきありがとうございます – William

関連する問題