barefly
barefly

Reputation: 378

How to to delete a line given with a variable in sed?

I am attempting to use sed to delete a line, read from user input, from a file whose name is stored in a variable. Right now all sed does is print the line and nothing else.

This is a code snippet of the command I am using:

FILE="/home/devosion/scripts/files/todo.db"
read DELETELINE
sed -e "$DELETELINE"'d' "$FILE"

Is there something I am missing here?

Edit: Switching out the -e option with -i fixed my woes!

Upvotes: 11

Views: 31445

Answers (4)

glenn jackman
glenn jackman

Reputation: 246807

You might have success with grep instead of sed

read -p "Enter a regex to remove lines: " filter
grep -v "$filter" "$file"

Storing in-place is a little more work:

tmp=$(mktemp)
grep -v "$filter" "$file" > "$tmp" && mv "$tmp" "$file"

or, with sponge (apt install moreutils)

grep -v "$filter" "$file" | sponge "$file"

Note: try to get out of the habit of using ALLCAPSVARS: one day you'll accidentally use PATH=... and then wonder why your script is broken.

Upvotes: 2

Bryan
Bryan

Reputation: 11

I found this, it allows for a range deletion with variables:

#!/bin/bash

lastline=$(whatever you need to do to find the last line)` //or any variation

lines="1,$lastline"

sed -i "$lines"'d' yourfile

keeps it all one util.

Upvotes: 1

Shahin
Shahin

Reputation: 29

Please try this :

sed -i "${DELETELINE}d" $FILE

Upvotes: 2

123
123

Reputation: 11216

You need to delimit the search.

#!/bin/bash

read -r Line

sed "/$Line/d" file

Will delete any line containing the typed input.

Bear in mind that sed matches on regex though and any special characters will be seen as such.
For example searching for 1* will actually delete lines containing any number of 1's not an actual 1 and a star.

Also bear in mind that when the variable expands, it cannot contain the delimiters or the command will break or have unexpexted results.

For example if "$Line" contained "/hello" then the sed command will fail with sed: -e expression #1, char 4: extra characters after command.

You can either escape the / in this case or use different delimiters.

Personally i would use awk for this

awk -vLine="$Line" '!index($0,Line)' file

Which searches for an exact string and has none of the drawbacks of the sed command.

Upvotes: 6

Related Questions