在 sed 中使用 nul 字符而不是“/”

Using the nul character in sed instead of "/"

我想删除包含路径的文件中的一行。应删除的路径存储在 bash 脚本的变量中。

我在某处读到,在 *nix 系统上,文件名允许包含除“/”和“\0”之外的任何字符。 由于我不能为此目的使用“/”(我有路径),所以我想使用 nul 字符。

我尝试了什么:

#!/bin/bash

var_that_contains_path="/path/to/file.ext"

sed "\[=10=]$var_that_contains_path"\0d file.txt > file1.txt #not working
sed "\0$var_that_contains_path"[=10=]d file.txt > file1.txt #not working

我怎样才能完成这项工作?提前致谢!

我认为您可能使用了错误的工具来完成这里的工作。只需使用 grep:

$ cat file
blah /path/to/file.ext more
some other text
$ var='/path/to/file.ext'
$ grep -vF "$var" file
some other text

如您所见,包含变量路径的行在输出中不存在。

-v 开关意味着 grep 进行反向匹配,因此只打印 匹配模式的行。 -F 开关意味着 grep 搜索固定字符串,而不是正则表达式。

由于文件名可以包含至少十几个不同的字符,这些字符对 sed 有特殊意义(.^[,仅举几例),正确这样做的方法是在搜索字符串中将它们全部转义:

Escape a string for a sed replace pattern

因此对于搜索模式(在本例中为路径),您需要以下表达式:

the_path=$(sed -e 's/[]\/$*.^|[]/\&/g' <<< "$the_path")