【问题标题】:sed replace end of line with text and quotesed 用文本和引号替换行尾
【发布时间】:2013-05-24 21:20:15
【问题描述】:

我正在尝试更改一行类型

DIRLIST="DIR/1 DIR/2 DIR/3"

使用 bash 脚本包含新的 DIR/4,其中 DIR/4 是命令行参数

目前,这是我的替换代码

sed "#DIRLIST#s#$# $logFolder\"#g" compress_log.sh > tmpCompress

这应该在包含 DIRLIST 的每一行上用 logFolder 的内容替换 $,并将其重定向到 tmpCompress,不是吗?

我面临的麻烦是我认为是由于斜线和引号之类的。

非常感谢任何帮助

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    下面的行将起作用。它

    • 搜索所有具有 DIRLIST 的行
    • 将行尾的“”改为....
    • "$logFolder" 后跟 ...
    • "字符

      sed '/DIRLIST/ s:"$:'"$logFolder"'":'

    但如果我把它分成几部分可能更容易理解

    sed '/DIRLIST/ s:"$:'            "$logFolder"             '":'
    

    请记住,您可以在一行中使用两种类型的引号,并且引号的目的是防止对特殊字符的解释。第一部分我使用单引号,因为我想同时引用双引号和美元符号。第二部分我用双引号括起来,因此 $ 被解释为变量,以防变量的值中有特殊字符(只要它不包含冒号)。第三部分我使用单引号将双引号和冒号括起来(s:old:new: 模式中的最后一个冒号)。

    我习惯于在 sed 脚本中使用“..”而不是“...”。更安全。

    【讨论】:

      【解决方案2】:

      不确定#DIRLIST# 是否应该匹配某个模式,但/DIRLIST/ 可以。

      $ export logFolder=NEWDIR
      $ echo 'DIRLIST="DIR/1 DIR/2 DIR/3"' | sed "/DIRLIST/ s#\"\$# $logFolder\"#g"
      DIRLIST="DIR/1 DIR/2 DIR/3 NEWDIR"
      

      【讨论】:

      • 这个确实有效,但我不认为你可以添加多个答案,所以无论如何谢谢,但由于额外的信息,我会接受布鲁斯的回答。
      【解决方案3】:

      这个命令会做:

      sed -e "#DIRLIST# s#\"\$# $logFolder\"#g" compress_log.sh > tmpCompress
      

      您的版本失败的原因是“$#”被替换为交互式 shell 的位置参数的数量为零。

      结果sed 改为执行此脚本:

      #DIRLIST#s#0 <value of logFolder>"#g
      

      如果你在命令前加上 echo,你可能已经看到了,像这样:

      echo sed "#DIRLIST#s#$# $logFolder\"#g" compress_log.sh
      

      为了避免使用反斜杠转义“$”。

      接下来,由于您需要在引号内添加新文件夹,因此您还需要匹配并替换最后一个引号。

      另外,“g”标志是不必要的,因为每一行只有一个“字符串结尾”与“$”匹配,所以它不能匹配多次。

      【讨论】:

      • 这在我的系统上不起作用。您需要将#DIRLIST# 更改为/DIRLIST/
      【解决方案4】:

      以下也可以使用

      old_folder='DIR[/]1 DIR[/]2 DIR[/]3'
      sed "/""${old_folder}""/"' s#$# '"$logFolder"'#'
      

      【讨论】:

      • 是的,但这需要知道我已经包含了哪些文件夹,而我的解决方案也必须适用于未知文件夹
      猜你喜欢
      • 2014-01-18
      • 2011-06-19
      • 2013-10-19
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 2016-08-10
      相关资源
      最近更新 更多