Ksh美元和回车字符串

时间:2015-07-30 02:00:28

标签: sed ksh carriage-return dollar-sign

我有一个ksh脚本,我在插入几行文件时遇到问题。

#!/bin/ksh
FILE_NAME="/tmp/t.xml"
LINE="<moid>ManagedElement=1,Equipment=1,Subrack=MAIN,Slot=3,PlugInUnit=1</moid>"
COUNTER_VALUE=`grep -A4 $LINE $FILE_NAME | sed -e '/-/,\$d' | grep '<r>`

sed   "1i$COUNTER_VALUE" $FILE_NAME

Ksh调试日志asb如下。

aaa[678] /tmp$ ksh -x ./t.ksh
+ FILE_NAME=/tmp/t.xml
+ LINE='<moid>ManagedElement=1,Equipment=1,Subrack=MAIN,Slot=3,PlugInUnit=1</moid>'
+ grep -A4 '<moid>ManagedElement=1,Equipment=1,Subrack=MAIN,Slot=3,PlugInUnit=1</moid>' /tmp/t.xml
+ grep '<r>'
+ sed -e '/-/,$d'
+ COUNTER_VALUE=$'<r></r>\n<r></r>'
+ sed $'1i<r></r>\n<r></r>' /tmp/t.xml
sed: -e expression #1, char 11: unknown command: `<'

我的问题是变量COUNTER_VALUE中的第一个美元符号是什么。 我实际上想要如下所示的COUNTER_VALUE。

COUNTER_VALUE='<r></r>\n<r></r>'

保持回车,没有烦人的美元符号。 这个特殊的美元在我的sed命令中产生问题。

请帮忙。

文件t.xml的内容如下。

<gp>900</gp>
<mt>pmSwitchIngressDiscards</mt>
<mt>pmSwitchIngressLoad</mt>
<mv>
<moid>ManagedElement=1,Equipment=1,Subrack=MAIN,Slot=3,PlugInUnit=1</moid>
<r></r>
<r></r>
</mv>
<mv>

1 个答案:

答案 0 :(得分:3)

$中的COUNTER_VALUE=$'<r></r>\n<r></r>'实际上并不存在。

-x向您显示该字符串中的\n文字换行符,而不是两个字符\n。< / p>

嵌入式换行是问题所在。有了它,sed将1i<r></r>视为一个命令,然后将<r></r>视为第二个命令。

您需要删除和/或转义该换行符才能使其正常工作。

你可以通过以下方式逃避它:

COUNTER=${COUNTER//$'\n'/$'\\\n'}