我是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
它可能不会扩展变量,因为它不会在输出中替换它。
答案 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
作为正则表达式分隔符,初始分隔符必须为,
- 已转义。