【问题标题】:Using the nul character in sed instead of "/"在 sed 中使用 nul 字符而不是“/”
【发布时间】:2015-05-01 12:20:20
【问题描述】:

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

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

我尝试了什么:

#!/bin/bash

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

sed "\\\0$var_that_contains_path"\\0d file.txt > file1.txt #not working
sed "\\0$var_that_contains_path"\0d file.txt > file1.txt #not working

我怎样才能做到这一点?提前致谢!

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    我认为您可能在这里使用了错误的工具来完成这项工作。只需使用 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 搜索固定字符串,而不是正则表达式。

    【讨论】:

      【解决方案2】:

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

      Escape a string for a sed replace pattern

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 2021-10-23
        • 2015-04-11
        • 2022-01-11
        • 2015-03-01
        • 2014-08-18
        • 2018-09-03
        • 2013-10-20
        相关资源
        最近更新 更多