Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delete lines containing pattern at the end of line

Tags:

sed

Quite certainly I miss something basic. My file contains lines like

fooLOCATION=sdfmsvdnv

fooLOCATION=

barLOCATION=sadssf

barLOCATION=

and I want to delete all lines ending with LOCATION=.

sed -i '/LOCATION=$/d' file

does not do, it deletes nothing, and I have tried endless variations, but I don't get it. What inline sed command can do this?

like image 545
manes Avatar asked Mar 10 '16 22:03

manes


People also ask

How do you delete all lines from the current position to the end of the file in vi?

To delete a line in Vi or Vim, switch to normal mode first. If you're into command mode or insert mode, you can switch back to normal mode by pressing Escape. Highlight the line that you want to delete, then hit dd or D on the keyboard. The editor will automatically remove the whole line from the file.

How do I remove a specific pattern from a Unix file?

Sed Command to Delete Lines – Based on Pattern Match. In the following examples, the sed command deletes the lines in file which match the given pattern. ^ is to specify the starting of the line. Above sed command removes all the lines that start with character 'u'.


1 Answers

There are two approaches here, either print all non-matching lines with

sed -in '/LOCATION=$/!p' file

or delete all matching names with

sed -i '/LOCATION=$/d' file

The first uses the n command line option to suppress the default action of printing the line. We then test for lines that end in LOCATION= and invert the pattern (only keeping those that don't match). When we get a desirable line, we print it with the p option.

The second looks for lines matching the end of line pattern, and deletes those that do.

Your file contains blank lines, and both of these keep those. If we don't want to keep those, we can change the first option to

sed -in '/^$/!{/LOCATION=$/!p}' file

which first checks if a line is not empty, and only bothers checking if it should be printed if it isn't empty. We can modify the second option to

sed -i '/^$/d;/LOCATION=$/d' file

which deletes blank lines and then checks about deleting the other pattern.


We can modify the options to work with different line ending by specifying the difference in the pattern. The difference between line endings on Unix/Linux (\n) and Windows (\r\n) is the presence of an extra carriage return on Windows. Modifying the four commands above to accept either, we get

  1. sed -in '/LOCATION=\r\{0,1\}$/!p' file
  2. sed -i '/LOCATION=\r\{0,1\}$/d' file
  3. sed -in '/^\r\{0,1\}$/!{/LOCATION=\r\{0,1\}$/!p}' file
  4. sed -i '/^\r\{0,1\}$/d;/LOCATION=\r\{0,1\}$/d' file

Note that in each of these we allow an optional \r before the end of line. We use the curly bracket notation, as sed does not support the question mark optional quantifier in normal mode (using the r option to GNU sed for enabling extended regular expressions, we can replace \{0,1\} with ?).


On a Windows shell, all of the options above require double quotes instead of single quotes.

like image 127
Matthew Avatar answered Nov 16 '22 12:11

Matthew