次のテキストファイルを参照してください。
/home/user1/dir1
/home/user1/dir2
/home/user1/
/home/user1/dir1/dir11
目標は "/home/user1/" だけで他に何もない行を削除することですので、最終結果は次のようになります。
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11
以下のコードを試しましたが、/home/user1/を含むすべての行が削除されました。何をすべきか知っていますか?
grep -v "/home/user1/" /home/user1/input.txt > tmpfile && mv tmpfile /home/user1/output.txt
答え1
アンカーポイントを使用して、線の開始と終了を表示します(^
開始と$
終了)。その後、状況は次のようになります。
$ grep -v '^/home/user1/$' file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11
または、次の-x
オプションを使用できます。
-x, --line-regexp match only whole lines
それから
$ grep -vx '/home/user1/' file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11
あなたのgrep
コマンドは予期されたタスクを実行しています。一致するすべての行を見つけます。含む /home/user1/
、正確に一致しません。
答え2
sed
オプションなら
$ sed -n '\|\(/\([^/]*/\)\{2\}\)\<|p' input_file
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11
答え3
これがファイルの正確な内容である場合、GNUを使用する簡単な解決策は次のとおりですsed
。
sed '/^\/home\/user1\/$/d' file
^
行の先頭を表示し、$
行の終わりを表示するので、正確な文字列だけが一致します。文字列のインスタンス\
をエスケープするために使用されます。/
文字列行に末尾のスペースが含まれている場合は、次の方法を使用できます。
sed '/^\/home\/user1\/[[:space:]]*$/d' file
出力:
/home/user1/dir1
/home/user1/dir2
/home/user1/dir1/dir11
要件を満たしている場合は、-i
ファイルを追加してその場所で編集してください。
sed -i '/^\/home\/user1\/$/d' file
sed -i '/^\/home\/user1\/[[:space:]]*$/d' file