Question

Any Script to Change One Line in a File

Asked by: BogoJoker

I want to edit one line in a file on my computer.  All i do is simply put a '>' character on the line that has the word "three" on it (lets assume there is only one line).  I have to do this often so I want to make this as easy as possible to do, be it a shell script, a bash script, or a single command that I can alias.  Here is an example:

example.txt (BEFORE)
one
two
three
four

example.txt (AFTER)
one
two
> three
four


What I have: simple.pl (it does work)
#!/usr/bin/perl
use warnings;
use strict;

# Vars (could be command line args)
my $FILE = 'example.txt';
my $WORD = 'three';

# Generate a list of lines in the text file,
# and add the '>' to the line with WORD
open(IN, $FILE) or die("$!");
my @lines = <IN>;
for (@lines) {
  chomp;
  if ($_ =~ /^$WORD$/) {
    $_ = '>'.$_;
  }
}
close(IN);

# Rewrite the file with the line change
open(OUT, '>example.txt') or die("$!");
print OUT join("\n", @lines);
close(OUT);


What I want:
What other ways can this be done? Bash scripts, better perl scripts, Awk, command line only?
Be creative, I am learning shell scripting and PERL but I think there has to be a better way to do this seemingly simple task.  This is for my own learning experiences, so be as complex as you want, I look forward to it!

Thanks,
Joe P

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2007-02-18 at 15:12:32ID22397652
Tags

change

,

file

,

script

,

line

,

one

Topics

Unix Systems Programming

,

Linux Programming

,

Perl Programming Language

Participating Experts
2
Points
500
Comments
15

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. perl/awk question
    I have a perl script where I need to extract a particular field from the output of ps. At the command line, if I issue the command: ps -ef | grep arnie | grep -v grep | awk '{print $6}' I get the expected results, in this case all of the contents of the sixth fields from ps...
  2. awk in perl
    system("awk '{print $1 $2 $3}' temp.txt"); I expect only the first 3 columns of the file to get printed. But it prints out all the columns, Why is that? Thanks Thomas
  3. Command Line Args
    Hi there, Is there any way to have a perl script run in linux utilize command line args. For instance, I want to run my script called myscript.pl and have args following to be referenced as variables later. Thanks! Brett
  4. query regarding interaction of awk with perl
    hi I have a file output.txt which has 20 enteries like this sardesai file1 Y pravin file2 Y sirdesai file3 Y sirdesai file6 N suraj file3 N I want to change "Y" to "N" i have written a code in awk like this which works awk '$3=="Y" {$3=&quo...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: ozoPosted on 2007-02-18 at 16:12:12ID: 18560356

perl -i -pe 's/^(?=three$)/> /' example.txt

 

by: ozoPosted on 2007-02-18 at 16:18:30ID: 18560385

sed -i -e 's/^three$/> &/' example.txt

 

by: BogoJokerPosted on 2007-02-18 at 18:31:19ID: 18560704

Wow, nice ozo!  Could explain the first script?
perl -i -pe 's/^(?=three$)/> /' example.txt


perl -i allows

 

by: BogoJokerPosted on 2007-02-18 at 18:40:34ID: 18560742

Wow, nice ozo!  Could explain the first script?
perl -i -pe 's/^(?=three$)/> /' example.txt


-i: allows editting of files in place
-e: allows one line of code on the command line
-p:   assume loop like -n but print line also, like sed (don't quite understand what this means, perform the line of code for every line in the file?)

Then the actual line of code:
s/^(?=three$)/> /

I thought I knew Regex inside and out but apparently not.  An online source said:
(?=pattern)
    A zero-width positive lookahead assertion. For example, /\w+(?=\t)/ matches a word followed by a tab, without including the tab in $&.

Does that mean that you replace the "nothing" in front of the word "three" with  '> ', because of the allow editting files in place?

Really great script, I am going to study your sed example now!

Joe P

 

by: BogoJokerPosted on 2007-02-18 at 19:30:35ID: 18560887

My friend pointed out:
file_put_contents(str_replace($word, "> ".$word, file_get_contents($file)));
a nice php one-liner if you have php on the linux box.

Also this website repeats ozo's perl one liner search and replace: and my understanding of the script is better after studing it and playing around with it.
http://joseph.randomnetworks.com/archives/2005/08/18/perl-oneliner-recursive-search-and-replace/

Is it possible to perform the equivalent using the map function?  I figured it would be like this:
open(IN,'example.txt') or die("$!");
@lines = map { chomp; s/^(?=three$)/> / } <IN>
...

But from a failed attempt and some research shows that s/// does not work well inside map because it doesn't return $_, instead it returns a 0 or a 1.

I'll keep looking for somre more creative examples but I like ozo's perl script.

Keem em coming,
Joe P

 

by: ozoPosted on 2007-02-18 at 20:04:18ID: 18560977

@lines = map { chomp; s/^(?=three$)/>; $_ } <IN>

 

by: BogoJokerPosted on 2007-02-18 at 20:18:03ID: 18561003

Small typo, this worked for me:
my @lines = map { chomp; s/^(?=three$)/> /; $_ } <IN>;

Thanks ozo, I'll leave this open until tommorrow afternoon and accept all the solutions.
Thanks for your help.  I'm still learning, didn't know I could do that in the map() functin.

Joe P

 

by: Perl_DiverPosted on 2007-02-18 at 21:30:34ID: 18561190

written as a script instead of a one-liner:

#!/usr/bin/perl
use warnings;
use strict;

# Vars (could be command line args)
my $FILE = $ARGV[0] ||  'example.txt';
my $WORD = $ARGV[1] || 'three';

{
   local @ARGV = ($FILE);
   local $^I = '.bac';
   while (<>) {
      if (/^$WORD$/) {
         print "> $WORD\n";
      }
      else {
         print;
      }
   }
}

 

by: ozoPosted on 2007-02-18 at 22:06:44ID: 18561277

perl -MO=Deparse -i.bak -pe 'BEGIN{$word=shift}s/^($word)/> $1/' three example.txt
BEGIN { $^I = ".bak"; }
sub BEGIN {
    $word = shift @ARGV;
}
LINE: while (defined($_ = <ARGV>)) {
    s/^($word)/> $1/;
}
continue {
    print $_;
}

 

by: BogoJokerPosted on 2007-02-19 at 07:03:37ID: 18563254

Excellent Perl_Driver, I confirmed it works with testing and also this website uses similar constructs:
http://www.thescripts.com/forum/thread591710.html

Speaking of which I have a few questions about your script after researching:
local @ARGV = ($FILE);
local $^I = '.bac';

I found that:
$^I -- Holds the file extension used to create a backup file for the in-place editing specified by the -i command line option. For example, it could be equal to ".bak."
http://www.cs.cf.ac.uk/Dave/PERL/node104.html
  -- and --
If $^I is set (either from within the program, or by the -i commandline switch), opening files with the diamond operator (<>) automatically performs a similar operation (allowing editing in place by holding a backup file. Notice I didn't need the loop for @ARGV; that's implicit in the diamond operator. The value set for $^I (normally undef) is added to the names of the files in @ARGV to create backup files.
http://www.stonehenge.com/merlyn/UnixReview/col23.html

So my question:
local @ARGV = ($FILE);
Just to make sure I have grasped it: This is making a list of one element (the file name) and putting into @ARGV solely for the block ({ ... }) so that the while(<>) will read from the $FILE as if it was on the command line because the <> reads $ARGV[0] like a file?  That is freaking brilliant!


ozo: yours is more complicated and I have more questions but I spent about 20-30 minutes studing Perll_Driver's script so I will have to give yours a fair amount of time as well.  Especially researching perl's command line arguments which I have just started looking at because of your excellent one-line scripts.

It is nice to see I went back and shortened my script a little cutting of the if(/^$WORD$/) { ... } down to s/^($WORD)$/> $1/ and I see that your new script uses this regex as well.

Thanks again both of you!
Joe P

Perl_Driver shortened script: (maybe microseconds slower, but no branching could speed it up?)
#!/usr/bin/perl
use warnings;
use strict;

# Vars (could be command line args)
my $FILE = $ARGV[0] ||  'example.txt';
my $WORD = $ARGV[1] || 'three';

{
   local @ARGV = ($FILE);
   local $^I = '.bac';
   while (<>) {
      s/^($WORD)$/> $1/;
      print;
   }
}

 

by: Perl_DiverPosted on 2007-02-19 at 11:35:47ID: 18565276

BogoJoker:

you are correct in all the comments you posted directed towards me.

I don't know if your shortened script would be any faster or slower than what I posted. But it is a good way to do the same thing.

 

by: Perl_DiverPosted on 2007-02-19 at 11:37:31ID: 18565293

I think you will enjoy this link too:

http://www.perl.com/pub/a/2004/10/14/file_editing.html

 

by: BogoJokerPosted on 2007-02-19 at 13:16:13ID: 18566198

Excellent link Perl_Driver.  I have heard about the FMTYEWTK pages because I just started following this tutorial here: (and the introduction mentioned those pages)
http://www.perl.org/books/beginning-perl/

Thanks for the link, it will certainly help me, and I bookmarked it immediatly.

Again thanks to both you and ozo for helping me out and for suffering through my always long questions and comments =):

I'll get there yet!
perl -e '$points=$ARGV[0]; @scores=split(/_/, $points); print join("\n",@scores), "\n";' 250_250

Joe P

 

by: BogoJokerPosted on 2007-02-19 at 13:18:52ID: 18566238

Hmm, Accepted Solution I guess is the one that received the most points.  Overall I liked the first one-liner and would have taken that as the "Accepted" but they were all great and I thank you guys once again.

Joe P

 

by: Perl_DiverPosted on 2007-02-19 at 15:34:51ID: 18567284

you're welcome.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...