Bashを使用してファイルから絶対パスを削除する

Bashを使用してファイルから絶対パスを削除する

他のファイルへの絶対パスを含む "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

sedGNUと二重引用符を使用して変数を拡張できます。

sed -i.bak "\:^${path}$:d" list.txt
  • -iここでは、図のように一致するパターンを内部で置き換え/削除する作業を行いましたが、元の$pathファイルは.bak次のようにバックアップされています。list.txtlist.txt.bak
  • sed我々は、will containにスラッシュを含むエラーを防ぐためにさまざまな区切り文字を使用します。/$path
  • 部分一致ではなく、行全体のパスを一致させるために、行の開始^と行の終わりのアンカーを使用します。$
  • 区切り文字がスラッシュでない場合は必須であるため、最初の区切り文字を開くことを避けました/man sedファイルに書き込みます。

    \cregexpc
        Match lines matching the regular expression regexp.
        The c may be any character.
    

    これは実際にsed次のキャラクターが私たちのものであることを示しています。区切り記号

関連情報