
他のファイルへの絶対パスを含む "list.txt"ファイルがあります。
/home/lin/bash/aaa
/home/lin/bash/song.mp3
/home/lin/bash/doc.html
/home/lin/bash/directory
変数にパスを割り当てたい
path="/home/lin/bash/song.mp3"
次に、そのパスの行全体を削除します。頑張った
sed -i '$path' list.txt
そして他の多くのコマンドはgrep、echoですが、何も機能しません。
答え1
努力するgrep
もう一度閉じると機能します。
grep -xv "$path" list.txt > tmp_$$ && mv tmp_$$ list.txt
最終list.txt
コンテンツ:
/home/lin/bash/aaa
/home/lin/bash/doc.html
/home/lin/bash/directory
答え2
ソリューションには2つの問題があります。まず、式を表現するために一重引用符を使用するため、'$path'
変数のように扱われず、文字通り処理されます$path
。この問題を解決するには、二重引用符を使用してください"$path"
。しかし、2番目の問題に直面することになります。スラッシュを/
特殊記号として使用しようとするsed
と同時に、この記号がパスに表示されて混乱しますsed
。したがって、スラッシュの代わりに別の記号を使用する必要があります。たとえば、カンマを使用します。
$ sed -i "s,${path},," list.txt
$ cat list.txt
/home/lin/bash/aaa
/home/lin/bash/doc.html
/home/lin/bash/directory
Tim Kennedyは、空白行を残さない別の素晴らしいアプローチを考案しました(操作方法の説明については、以下の説明を参照)。
$ sed -i "\,${path},d" list.txt
$ cat list.txt
/home/lin/bash/aaa
/home/lin/bash/doc.html
/home/lin/bash/directory
答え3
sed
GNUと二重引用符を使用して変数を拡張できます。
sed -i.bak "\:^${path}$:d" list.txt
-i
ここでは、図のように一致するパターンを内部で置き換え/削除する作業を行いましたが、元の$path
ファイルは.bak
次のようにバックアップされています。list.txt
list.txt.bak
sed
我々は、will containにスラッシュを含むエラーを防ぐためにさまざまな区切り文字を使用します。/
$path
- 部分一致ではなく、行全体のパスを一致させるために、行の開始
^
と行の終わりのアンカーを使用します。$
区切り文字がスラッシュでない場合は必須であるため、最初の区切り文字を開くことを避けました
/
。man sed
ファイルに書き込みます。\cregexpc Match lines matching the regular expression regexp. The c may be any character.
これは実際に
sed
次のキャラクターが私たちのものであることを示しています。区切り記号。