简体   繁体   中英

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!

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.

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

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 .

请试试这个:

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM