[SOLVED] delete a matched line from the file+shell script
ProgrammingThis forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Introduction to Linux - A Hands on Guide
This guide was created as an overview of the Linux Operating System, geared toward new users as an exploration tour and getting started guide, with exercises at the end of each chapter.
For more advanced trainees it can be a desktop reference, and a collection of the base knowledge needed to proceed with system and network administration. This book contains many real life examples derived from the author's experience as a Linux system and network administrator, trainer and consultant. They hope these examples will help you to get a better understanding of the Linux system and that you feel encouraged to try out things on your own.
Click Here to receive this Complete Guide absolutely free.
I am matching some lines in a file. If my choice of line is matched, that line should be deleted from the file without using intermediate files.
Please help me.
Please note that the lines in file contains only word. So deleting the entry itself makes sure line is deleted. Any help is appreciated
for i in dog horse
<<Delete lines with $i on $file >>
"without using intermediate files" -this is basically impossible. Even when you use 'sed -i' it will create a temposrary file. The only way to avoid this would be to read each file fully into an array, manipulate the arrays and then overwrite the original files once done.
It usually helps to mention things like which platform you're using, you know. Since this is LinuxQuestions, we generally assume you're using Linux unless stated otherwise.
-i is a non-posix gnu extension to sed, and not available in most other implementations. There's no way to get those versions to save directly to file.
(Although you could capture its stdout to a variable, for example, then echo the the modified version back over the original file.)
It's easier just to use ed, as shown above. Since ed is also posix, the command syntax posted will probably work anywhere, although you may need to adjust the shell syntax if you aren't using bash/ksh. I usually prefer to pipe the commands into it with printf myself.
printf '%s\n' 'g/\(horse\|dog\)/d' 'w' | ed -s yourfile
Last edited by David the H.; 01-02-2013 at 06:04 AM.
Thanks for providing info on 'ed'.
But instead of "printf '%s\n' 'g/horse/d' 'g/dog/d' 'w' | ed -s yourfile", I want to run this in a loop with the variable to be deleted.
I wanted to try "printf '%s\n' 'g/$i/d' 'w' | ed -s yourfile". This did not work.