sustituir reemplazar lineas linea leer insertar fichero especiales espacios eliminar comando caracteres blanco linux bash sed

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 .