Shell脚本 - 使用带有/的变量的sed

时间:2014-04-11 15:54:58

标签: linux bash shell sed

我是shell脚本的新手,不太了解。我有一组文件,我想附加一些文字。我不确定一个更好的方法,但我使用sed这样做。我在bash中编写了以下脚本来执行此操作(我正在使用以下文件集中的一个文件对其进行测试)。在这里,我将</notepads>替换为</notepads> "\n" <text to be appended>,以便在文件UIL_extract.ktr中的字符串<text to be appended>之后附加</notepads>。 (</notepads>只在文件中出现一次)

  FILE=UIL_extract.ktr
  FIND="</notepads>"
  SUB="$FIND"$'\n'`cat add.txt`
  echo "Finding $FIND in $FILE"
  echo "with $SUB"
  sed "s,${FIND},${SUB},g" $FILE > Temp.ktr

这是我执行时遇到的错误 -

sed: -e expression #1, char 25: unterminated `s' command

有些东西不对,我不知道是什么。

提前致谢。

PS - 我尝试了其他各种各样的事情。例如。如果我这样做 -

sed 's,"${FIND}","${SUB}",g' $FILE > Temp.ktr

它可能不会扩展变量,因为它不会在输出中替换它。

4 个答案:

答案 0 :(得分:1)

您需要正确引用 - 以便bash可以读取bash变量。

sed 's,'"${FIND}"','"${SUB}"',g' $FILE > Temp.ktr

另一个问题是处理'/ n'和可能的其他字符。 我会尝试类似的东西:

awk '{print}  /<\/notepads>/ {exit}' $FILE > /tmp/f1
awk 'BEGIN{found=0} /<\/notepads>/ {found=1;next} {if (found)print}' $FILE >/tmp/f2
cat /tmp/f1 add.txt /tmp/f2 > Temp.ktr
rm /tmp/f[23]

答案 1 :(得分:0)

将代码更改为SUB =&#34; $ FIND&#34; $&#39; \ n&#39;`cat add.txt`在第4行,它将起作用。

答案 2 :(得分:0)

您希望在找到文本add.txt后添加文件</notepads>的内容?那只是:

awk 'NR==FNR{add = add $0 ORS; next} {print} /<\/notepads>/{printf "%s",add}' add.txt UIL_extract.ktr
实际上sed实际上有一个r命令,但是对于任何多行使用sed是不可扩展的并且非常快速地变得非常复杂,所以你应该学习awk。

答案 3 :(得分:0)

回顾一下:

原始代码中的问题出现在s函数的替换文本 literal \n字符中。必须\ - 转义 - 否则sed命令将中断

虽然可以使用bash的变量扩展功能来转义$SUB - SUB=${SUB//$'\n'/\\$'\n'}中的换行符,但更简单的解决方案是使用{ {1}} sed函数(正如@Ed Morton在其回答中所述),可用于在前一个上下文地址(正则表达式)时输出文件的内容)匹配(在输出当前行之后):

r <file>

请注意,要使用FIND='</notepads>' sed "\,${FIND}, r add.txt" "$FILE" > Temp.ktr 作为正则表达式分隔符,初始分隔符必须为, - 已转义。