0

我正在尝试更改一行类型

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

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

目前,这是我的替换代码

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

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

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

非常感谢任何帮助

4

4 回答 4

3

下面的行将起作用。它

  • 搜索所有具有 DIRLIST 的行
  • 将行尾的 " 更改为....
  • "$logFolder" 后跟 ...
  • 性格

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

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

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

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

我更喜欢在 sed 脚本中习惯性地使用“..”而不是“...”。它更安全。

于 2013-05-23T16:37:43.527 回答
1

不确定是否#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"
于 2013-05-23T12:15:58.227 回答
1

此命令将执行此操作:

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”标志是不必要的,因为在每一行中只有一个“字符串结尾”与“$”匹配,因此它不能匹配多次。

于 2013-05-23T12:17:12.373 回答
1

以下也有效

old_folder='DIR[/]1 DIR[/]2 DIR[/]3'
sed "/""${old_folder}""/"' s#$# '"$logFolder"'#'
于 2013-05-23T16:49:36.387 回答