在完全匹配前缀路径之后从输入文件中删除行,直到文件中的$(pwd)

时间:2016-04-19 12:23:34

标签: bash shell

File.txt
/aaa/bbb/ccc/ddd
/aaa/bbb/ccc/mmm
/aaa/eee/ccc/ddd

如果我的$(pwd)/aaa/bbb/ccc 它应该只删除前两个
我试过像sed /^$(pwd)/d但没有工作

3 个答案:

答案 0 :(得分:2)

此处的问题是您正在使用$(pwd),它尝试执行命令pwd。此结果包含斜杠,因此最终命令类似于:

sed /^/aaa/bbb/ccc/d

哪个sed无法处理并返回错误:

  

sed:-e表达式#1,字符4:命令后的额外字符

您应该使用另一个分隔符。例如,_

sed "\_${PWD}_d"

如下面的123注释,如果它不是替换,则需要转义第一个分隔符。我还将var括在${ }中,以防止将变量视为PWD_而不是PWD

您可以使用awk获得更好的方法:

$ awk -v patt="$PWD" '!($0 ~ patt)' file
/aaa/eee/ccc/ddd

注意$PWD与执行pwd相同。

答案 1 :(得分:1)

grep也可以完成这项工作:

grep -v "$(pwd)" file

答案 2 :(得分:0)

准确地说出fedorqui的答案......

在您的问题中还有另一个问题,因为变量$ pwd包含特殊的sed符号(/)。 所以sed不会高兴......

例如,可以在此处找到一些解决方案:Replace a string in shell script using a variable

因此,您可以使用其他变量来解决此问题。

这项工作非常适合您的示例(我只需用echo / aaa / bbb / ccc')替换echo $(pwd)。

pwd_bis=$( echo $(pwd) | sed 's/[\/]/\\\0/g' )
sed "/^${pwd_bis}/d" File.txt