Sed插入多行

时间:2012-09-03 14:10:58

标签: shell sed

我正在尝试使用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: `
'

知道为什么吗?

感谢您的时间

3 个答案:

答案 0 :(得分:13)

在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

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

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

EOF

答案 1 :(得分:5)

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

答案 2 :(得分:1)

这可能对您有用:

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

' animalNames.txt