我有文件“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
下一个角色是我们的分隔符。