我正在尝试更改
类型的行DIRLIST="DIR/1 DIR/2 DIR/3"
使用bash脚本包含新的DIR / 4,其中DIR / 4是命令行参数
目前,这是我替换
的代码sed "#DIRLIST#s#$# $logFolder\"#g" compress_log.sh > tmpCompress
这应该用包含DIRLIST的每行替换$和logFolder的内容,并将其重定向到tmpCompress,不应该吗?
我面临的麻烦是我认为由于斜线和引号等等。
任何帮助非常感谢
答案 0 :(得分:2)
以下行可行。它
“字符
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"'#'