2012-09-03 32 views
6

Estoy tratando de hacer una inserción con sed (acaba de leer sobre ella) y estoy sorprendido al tratar de insertar varias líneas?Sed Insertar Líneas Múltiples

lo que estoy haciendo en la actualidad es:

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

Nota echo $line == 131

nuevo problema

Todo aparece en una línea en la salida? (También falta el primer guión)

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

Resuelta

Pero esta tiros:

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

Cualquier idea de por qué?

Gracias por su tiempo

+0

¿Qué versión de sed se utilizan? GNU/BSD? – Zulu

+0

GNU Lo siento, no me di cuenta de que hice un dif –

+0

Funciona aquí, GNU sed versión 4.2.1 – Thor

Respuesta

4

Para el nuevo problema: Uso doble barra invertida \\

+0

Sorprendente gracias, ¿por qué no podría encontrar esto en cualquier lugar de google? (Debe haber realizado más de 20 búsquedas de "sed insertado en varias líneas") –

+1

Porque para multilínea es mejor usar AWK. (en mi opinión) – Zulu

+0

En una nota al margen, ¿es posible leer un archivo para insertar "contenidos" en lugar de C & P en el comando sed? –

11

En un script de shell, la barra invertida + salto de línea se expande para nada. Es una forma de continuar a la siguiente línea sin tener una nueva línea en la cadena. Entonces, lo que ve Sed es solo una gran línea. Compare:

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

Tiene que pasar una barra invertida y una nueva línea de sed, por lo que escapar de la barra invertida, poniendo otra barra invertida antes de ella.

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

" animalNames.txt 

Esto puede ser más fácil de leer si pasa la secuencia de comandos en la entrada estándar como here document. Debe dejar la expansión para sustituir ${line}, por lo que aún necesita duplicar la barra diagonal inversa.

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

EOF 
+0

Gracias por toda la información adicional Gilles! –

+0

+1 para la versión heredoc. Estaba luchando para obtener un comando en línea que funciona con varias líneas que contienen varios metacaracteres y comillas significativos. Este método funcionó perfectamente la primera vez, y es mucho más limpio, por lo que será mi objetivo en el futuro. – randomsock

1

Esto podría funcionar para usted:

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

' animalNames.txt 
+0

Necesita usar \\ para una nueva línea –

+0

@PezCuckow para mí (usando GNU sed y bash) una sola \ es suficiente. – potong

Cuestiones relacionadas