【问题标题】:sed in-place command not deleting from file in bashsed 就地命令不会从 bash 中的文件中删除
【发布时间】:2015-03-08 11:31:21
【问题描述】:

我有一个 bash 脚本,它检查文件中的字符串模式并删除同一文件中的整行,但不知何故,它没有删除该行,也没有抛出任何错误。命令提示符中的相同命令从文件中删除。

#array has patterns
for k in "${patternarr[@]}
do
   sed -i '/$k/d' file.txt
done

sed 版本>4

当这个循环完成时,我希望从 file.txt 中删除与数组中字符串模式匹配的所有行

当我从命令提示符运行 sed -i '/pataern/d file.txt 时,它可以正常工作,但不能在 bash 中运行 提前致谢

【问题讨论】:

标签: bash sed


【解决方案1】:

这里:

sed -i '/$k/d' file.txt

sed 脚本是单引号,它可以防止shell 变量扩展。它将(可能)与

一起使用
sed -i "/$k/d" file.txt

我说“可能”是因为它会做什么取决于$k 的内容,它只是被替换到 sed 代码中并被解释为这样。如果$k 包含斜线,它将中断。如果它来自一个不可靠的来源,你就会对代码注入敞开心扉(尤其是使用 GNU sed,它可以用来执行 shell 命令)。

考虑k=^/ s/^/rm -Rf \//e; #

将 shell 变量替换为 sed 代码(或任何其他代码)通常是个坏主意。更好的方法是使用 GNU awk:

awk -i inplace -v pattern="$k" '!($0 ~ pattern)' file.txt

或者只使用grep -v 和一个临时文件。

【讨论】:

    【解决方案2】:

    首先,您的 for 语句中有一个围绕 ${patternarr[@]} 的未闭合双引号。

    那么您的问题是您在 参数中使用了单引号,导致您的 shell 无法评估引号内的 $k

    % declare -a patternarr=(foo bar fu foobar)
    % for k in ${patternarr[@]}; do echo sed -i '/$k/d' file.txt; done
    sed -i /$k/d file.txt
    sed -i /$k/d file.txt
    sed -i /$k/d file.txt
    sed -i /$k/d file.txt
    

    如果你用双引号替换它们,这里是:

    % for k in ${patternarr[@]}; do echo sed -i "/$k/d" file.txt; done
    sed -i /foo/d file.txt
    sed -i /bar/d file.txt
    sed -i /fu/d file.txt
    sed -i /foobar/d file.txt
    

    【讨论】:

      【解决方案3】:

      任何时候你在 shell 中编写一个循环只是为了操作文本你有错误的方法。这可能更接近你真正应该做的(不需要环绕循环):

      awk -v ks="${patternarr[@]}" 'BEGIN{gsub(/ /,")|(",ks); ks="("ks")} $0 !~ ks' file.txt
      

      但如果您向我们展示一些示例输入和预期输出,可能还有更好的方法(例如,仅检查 1 个字段而不是整行,或使用单词边界,或字符串比较或......)。

      【讨论】:

        【解决方案4】:

        您需要使用双引号在 命令中插入shell 变量,例如:

        for k in ${patternarr[@]}; do
            sed -i "/$k/d" file.txt
        done
        

        【讨论】:

          猜你喜欢
          • 2016-10-27
          • 1970-01-01
          • 2015-08-07
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 1970-01-01
          • 2022-09-05
          相关资源
          最近更新 更多