名前を含むテキストファイルがあります。私のプログラムに指示した名前を削除できるようにしたいと思います。
最初に、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
の場合、私にとっては重要ではありません。
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
行のフィルタリングは、grep
の主な役割です。 -v
スイッチを使用して一致を反転します。つまり、テキストを含まない行のみを表示します。したがって、次のコマンドを使用できます。
read deletename; grep -v $deletename test.txt