使用 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

您的解决方案有两个问题。首先,因为您使用单引号来表示'$path'该表达式,所以它是按字面处理的,而不是像变量 那样$path。为了解决这个问题,使用双引号"$path"。但接下来你会面临第二个问题:你想使用斜杠/作为特殊的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

您可以使用 GNUsed和双引号来扩展变量来做到这一点。

sed -i.bak "\:^${path}$:d" list.txt
  • 在这里,我们曾经-i对匹配的模式进行就地替换/删除,如 中所示$path.bak正在使用 to 备份原始list.txt文件list.txt.bak
  • 我们使用不同的分隔符来防止在will contains中sed出现斜杠失败。/$path
  • 我们使用行首^和行尾$锚点来匹配整行路径,而不是部分匹配。
  • 我们避免了打开第一个分隔符,因为当分隔符不是斜杠时,它是强制性的/。记录man sed在案。

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

    实际上这表明sed下一个角色是我们的分隔符

相关内容