linux - reemplazar - ¿Cómo eliminar una línea dada con una variable en sed?
sed linux reemplazar (2)
Estoy intentando usar sed
para eliminar una línea, leer de la entrada del usuario, desde un archivo cuyo nombre está almacenado en una variable. En este momento, todo lo que hace sed
es imprimir la línea y nada más.
Este es un fragmento de código del comando que estoy usando:
FILE="/home/devosion/scripts/files/todo.db"
read DELETELINE
sed -e "$DELETELINE"''d'' "$FILE"
¿Hay algo que me falta aquí?
Editar: ¡Al desactivar la opción -e
con -i
solucioné mis problemas!
Debe delimitar la búsqueda.
#!/bin/bash
read -r Line
sed "/$Line/d" file
Eliminará cualquier línea que contenga la entrada escrita.
Tenga en cuenta que sed coincide con la expresión regular y cualquier carácter especial se verá como tal.
Por ejemplo, buscar 1*
realidad eliminará las líneas que contengan cualquier cantidad de 1, no 1 real y una estrella.
También tenga en cuenta que cuando la variable se expande, no puede contener los delimitadores o el comando se romperá o tendrá resultados no explotados.
Por ejemplo, si "$ Line" contenía "/ hello", el comando sed fallará con sed: -e expression #1, char 4: extra characters after command
.
Puede escapar de /
en este caso o usar diferentes delimitadores.
Personalmente, usaría awk para esto
awk -vLine="$Line" ''!index($0,Line)'' file
Que busca una cadena exacta y no tiene ninguno de los inconvenientes del comando sed.
Puede tener éxito con grep en lugar de sed
read -p "Enter a regex to remove lines: " filter
grep -v "$filter" "$file"
Almacenar en el lugar es un poco más de trabajo:
tmp=$(mktemp)
grep -v "$filter" "$file" > "$tmp" && mv "$tmp" "$file"
o, con sponge
grep -v "$filter" "$file" | sponge "$file"
Nota: trate de dejar el hábito de usar ALLCAPSVARS: un día accidentalmente usará PATH=...
y luego se preguntará por qué su script está roto .