web-dev-qa-db-ja.com

変数を含む行を削除する

名前を含むテキストファイルがあります。私のプログラムに指示した名前を削除できるようにしたいと思います。

最初に、sedでできることを発見しましたが、うまくいきません。

deletenameは、検索に使用するパターンを含む変数です。test.txtはテキストファイルです。

私は使っている:

deletename=0; read deletename; sed...

私が試してみました:

sed "/$deletename/ d" test.txt
sed "/$deletename/d" test.txt
sed '/$deletename/ d' test.txt
sed '/$deletename/d' test.txt    
sed -e "/$deletename/ d" test.txt    
sed -e "/$deletename/d" test.txt
sed -e '/$deletename/ d' test.txt
sed -e '/$deletename/d' test.txt
sed -r "/$deletename/ d" test.txt
sed -r "/$deletename/d" test.txt
sed -r '/$deletename/ d' test.txt
sed -r '/$deletename/d' test.txt

これはどれも機能しなかったので、パターンのある行番号を確認し、その行を削除するというアイデアがありました。 grepを使用する必要があることは知っていますが、どのように使用すればよいのかまったくわかりません。

私はこのようなことを試みましたが、うまくいきませんでした:

lineno=`expr grep -n $deletename test.txt`

誰かが助けることができますか? sedまたはgrepの場合、私にとっては重要ではありません。

4
znst

readを使用して名前を渡し、名前を含む行を削除する場合:

read deletename; sed "/$deletename/d" test.txt

次に押す enter そしてreadは何かが入力されるのを待つので、deletenameにしたいものを何でも入力してください。たとえば、0 enter 再びsedコマンドが実行されます。 test.txtの内容は端末に表示されますが、0を含むすべての行、または入力したものはすべてストリームから削除されます(ファイルからではありません)

名前のみを削除する場合は、次のようになります。

read deletename; sed "s/$deletename//g" test.txt

次に0と入力すると、0のすべてのインスタンスが削除されます。

出力を新しいファイルにリダイレクト(またはtee)するか、またはその場でファイルを変更したい場合に、-iフラグを使用します(テスト後)

read deletename; sed -i "/$deletename/d" test.txt

この場合、出力は表示されません。変更は、ターミナル(STDOUT上)に表示されるのではなく、ファイルに書き込まれます。

単一引用符では抑制されるため、パラメータの拡張を許可するには二重引用符を使用する必要があります。しかし、最も簡単な方法は、この単純なケースでは必要ではありませんが、式の他の部分を単一引用符で囲み、通常どおり変数を引用することです。

sed 's/'"$deletename"'//g' test.txt
5
Zanna

行のフィルタリングは、grepの主な役割です。 -vスイッチを使用して一致を反転します。つまり、テキストを含まない行のみを表示します。したがって、次のコマンドを使用できます。

read deletename; grep -v $deletename test.txt
3
Jim