Sed Ksh美元和回车符以字符串形式返回

Sed Ksh美元和回车符以字符串形式返回,sed,ksh,carriage-return,dollar-sign,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$COU

我有一个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
#/bin/ksh
FILE_NAME=“/tmp/t.xml”
LINE=“ManagedElement=1,设备=1,子框=MAIN,插槽=3,插件单元=1”
计数器值=`grep-A4$LINE$FILE\u NAME | sed-e'/-/,\$d'| grep'`
sed“1i$计数器值”$文件名
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: `<'
aaa[678]/tmp$ksh-x./t.ksh
+文件名=/tmp/t.xml
+LINE='ManagedElement=1,设备=1,子框=MAIN,插槽=3,插件单元=1'
+grep-A4'ManagedElement=1,设备=1,子框=MAIN,插槽=3,插件单元=1'/tmp/t.xml
+格雷普“
+sed-e'/-/,$d'
+计数器\u值=$'\n'
+sed$'1i\n'/tmp/t.xml

sed:-e表达式#1,char 11:未知命令:`COUNTER\u VALUE=$'\n'
中的
$
实际上不存在

这是
-x
向您显示该字符串中的
\n
是一个文本换行符,而不是两个字符
\
n

嵌入的新行就是问题所在。有了它,sed将
1i
视为一个命令,然后将
视为第二个命令

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

您可以通过以下方式逃避:

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

计数器中的
$
值=$'\n'
实际上不存在

这是
-x
向您显示该字符串中的
\n
是一个文本换行符,而不是两个字符
\
n

嵌入的新行就是问题所在。有了它,sed将
1i
视为一个命令,然后将
视为第二个命令

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

您可以通过以下方式逃避:

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

计数器中的
$
值=$'\n'
实际上不存在

这是
-x
向您显示该字符串中的
\n
是一个文本换行符,而不是两个字符
\
n

嵌入的新行就是问题所在。有了它,sed将
1i
视为一个命令,然后将
视为第二个命令

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

您可以通过以下方式逃避:

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

计数器中的
$
值=$'\n'
实际上不存在

这是
-x
向您显示该字符串中的
\n
是一个文本换行符,而不是两个字符
\
n

嵌入的新行就是问题所在。有了它,sed将
1i
视为一个命令,然后将
视为第二个命令

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

您可以通过以下方式逃避:

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

谢谢你的回答。但是,如果我添加一行计数器,\u值='\n'。它起作用了。为什么?因为那里的行没有使用ANSI C引号将
\n
转换为文字换行,而不是两个字符。如果手动使用
COUNTER\u VALUE=$'\n'
将获得与脚本相同的效果。好的,我需要回车符。转义这个
\n
的最佳方法是什么?就像我说的,如果你需要插入内容中的换行符,你需要用反斜杠“\”转义。对不起,我知道我需要转义新行。但是,我无法更改源文件,我应该如何做?谢谢您的回答。但是,如果我添加一行计数器,\u值='\n'。它起作用了。为什么?因为那里的行没有使用ANSI C引号将
\n
转换为文字换行,而不是两个字符。如果手动使用
COUNTER\u VALUE=$'\n'
将获得与脚本相同的效果。好的,我需要回车符。转义这个
\n
的最佳方法是什么?就像我说的,如果你需要插入内容中的换行符,你需要用反斜杠“\”转义。对不起,我知道我需要转义新行。但是,我无法更改源文件,我应该如何做?谢谢您的回答。但是,如果我添加一行计数器,\u值='\n'。它起作用了。为什么?因为那里的行没有使用ANSI C引号将
\n
转换为文字换行,而不是两个字符。如果手动使用
COUNTER\u VALUE=$'\n'
将获得与脚本相同的效果。好的,我需要回车符。转义这个
\n
的最佳方法是什么?就像我说的,如果你需要插入内容中的换行符,你需要用反斜杠“\”转义。对不起,我知道我需要转义新行。但是,我无法更改源文件,我应该如何做?谢谢您的回答。但是,如果我添加一行计数器,\u值='\n'。它起作用了。为什么?因为那里的行没有使用ANSI C引号将
\n
转换为文字换行,而不是两个字符。如果手动使用
COUNTER\u VALUE=$'\n'
将获得与脚本相同的效果。好的,我需要回车符。转义这个
\n
的最佳方法是什么?就像我说的,如果你需要插入内容中的换行符,你需要用反斜杠“\”转义。对不起,我知道我需要转义新行。但是,我无法更改源文件,我应该如何做?