在 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")
我想删除包含路径的文件中的一行。应删除的路径存储在 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")