8

sedで挿入しようとしています(読んだばかりです)が、複数行を挿入しようとして困惑していますか?

私が現在していることは:

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

echo $line==131

新しい問題

すべてが出力の1行に表示されますか?(最初のインデントもありません)

/* 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

シェルスクリプトでは、バックスラッシュ+改行は何にも展開されません。これは、文字列に実際に改行を入れずに次の行に進む方法です。つまり、sedが見ているのは1つの大きな線だけです。比較:

$ 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}必要があるため、バックスラッシュを2倍にする必要があります。

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 に答える