sed用文本和引号替换行尾

时间:2013-05-23 11:59:27

标签: bash sed

我正在尝试更改

类型的行
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 个答案:

答案 0 :(得分:2)

以下行可行。它

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

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

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

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

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

我宁愿习惯用sed脚本中的'..'代替“...”。它更安全。

答案 1 :(得分: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"

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

答案 3 :(得分:1)

以下作品

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