8

我正在尝试使用 sed 进行插入(刚刚阅读过它)并且我试图插入多行而被难住了?

我目前正在做的是:

sed -i "${line} i\
        /* Name - ID */ \
        select  @ID = NULL \
        from    Animals \
        where   VrsnID = @VrsnID \
        and     Request= \"Request\" \
 \
" animalNames.txt

注意echo $line== 131

新问题

输出中的所有内容都出现在一行上?(也缺少第一个缩进)

/* Name - ID */        select  @ID = NULL         from    Animals         where   VrsnID = @VrsnID         and     Request= "Request"

解决

但这会引发:

sed: -e expression #1, char 47: unknown command: `
'

知道为什么吗?

谢谢你的时间

4

3 回答 3

14

在 shell 脚本中,反斜杠+换行符扩展为空。这是一种在字符串中实际上没有换行符的情况下继续下一行的方法。所以 sed 看到的只是一条大线。相比:

$ echo "foo\
> bar"
foobar
$ echo "foo
> bar"
foo
bar

您需要向 sed 传递一个反斜杠和一个换行符,因此通过在反斜杠前面放置另一个反斜杠来避开反斜杠。

sed -i "${line} i\\
        /* Name - ID */ \\
        select  @ID = NULL \\
        from    Animals \\
        where   VrsnID = @VrsnID \\
        and     Request= \"Request\" \\

" animalNames.txt

如果您将标准输入上的脚本作为此处文档传递,这可能更具可读性。您需要将扩展​​保留在替换上${line},因此您仍然需要将反斜杠加倍。

sed -i -f - animalNames.txt <<EOF
${line} i\\
        /* Name - ID */ \\
        select  @ID = NULL \\
        from    Animals \\
        where   VrsnID = @VrsnID \\
        and     Request= "Request" \\

EOF
于 2012-09-03T14:47:05.007 回答
7

对于新的麻烦:使用双反斜杠\\

于 2012-09-03T14:40:45.670 回答
1

这可能对您有用:

sed ${line}'i\
    /* Name - ID */ \
    select  @ID = NULL \
    from    Animals \
    where   VrsnID = @VrsnID \
    and     Request= \"Request\"

' animalNames.txt
于 2012-09-03T19:48:42.570 回答