File.txt
/aaa/bbb/ccc/ddd
/aaa/bbb/ccc/mmm
/aaa/eee/ccc/ddd
如果我的$(pwd)
是/aaa/bbb/ccc
它应该只删除前两个
我试过像sed /^$(pwd)/d
但没有工作
答案 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