Solved

Simple file editing question

Posted on 2002-05-31
18
161 Views
Last Modified: 2013-12-16
Let's say I have a directory with 1000 files each containing a line with  text e.g "entry=" which I want to replace with another text entery.

If someone has an emacs or commandline or script solution it would be appreciated.
0
Comment
Question by:dryzone
  • 11
  • 4
  • 2
  • +1
18 Comments
 
LVL 14

Expert Comment

by:chris_calabrese
Comment Utility
find . -type f | while read file
do  sed 's/something/something-else/' \
      < "$file" > "$file.tmp" \
    && mv "$file.tmp" "$file"
done
   
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
Ok were halfway there
Unfortunately the files contain text which is commented out. I need to uncomment these lines in bulk fashion.

The hash seems to create problems.
I checked with an echo that the filenames were read with your script and passed to sed, but the hash....seems to kick sed out.

sed 's/#exclude1='NEW'/exclude1=
0
 
LVL 14

Expert Comment

by:chris_calabrese
Comment Utility
The hash isn't the problem, it's the single-quotes inside the single-quoted sed arguments, plus the lack of a trailing /

sed "s/#exclude1='NEW'/exclude1=/"
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
No, I just did not copy all (see below), if sed has problems with quotes, then how the heck am I going to remove/replace them?

find . -type f | while read file
                       do  
echo reading $file
sed 's/#exclude1='NEW'/exclude1=Half.com/' < "$file" > "$file.tmp" && mv "$file.tmp" "$file"
                       done
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
OK you solved half of the problem.
Now how do I get rid of lines containing ' '
I could not figure out from sed man page.
0
 
LVL 51

Expert Comment

by:ahoffmann
Comment Utility
find . -type f -exec perl -i -pe 's/(.*entry=)something/$1something-else/' {} \;
0
 
LVL 3

Expert Comment

by:DVB
Comment Utility
Quote the #: \#
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
4 ahoffmann
Did not work.
Trying to replace e.g. 'NEW' in the files with e.g. hello failed.  'NEW' remained in the files.

find . -type f -exec perl -i -pe 's/(.*entry=)'NEW'/hello/' {} \;
0
 
LVL 51

Expert Comment

by:ahoffmann
Comment Utility
> find . -type f -exec perl -i -pe 's/(.*entry=)'NEW'/hello/' {} \;

this cannot work. Did you mean:

  find . -type f -exec perl -i -pe 's/(.*entry=)NEW/$1hello/' {} \;

or

  find . -type f -exec perl -i -pe 's/(.*entry=)'"'"'NEW'"'"'/$1hello/' {} \;
0
What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 1

Author Comment

by:dryzone
Comment Utility
The text files 100's of them contain the following text.

 'NEW'
#exclude2='a'
#exclude3='b'
#exclude4='c'
#exclude5='d'

Of which I want to replace 'NEW' with other text -e.g., new line,  to yield

new line
#exclude2='a'
#exclude3='b'
#exclude4='c'
#exclude5='d'

The examples above did not work.
'NEW' was not replaced with the new text e.g. new line

Note: I dont just want to replace NEW but rather 'NEW'  , which is why I have problems with my usual methods processing batches of files.
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
The text files 100's of them contain the following text.

 'NEW'
#exclude2='a'
#exclude3='b'
#exclude4='c'
#exclude5='d'

Of which I want to replace 'NEW' with other text -e.g., new line,  to yield

new line
#exclude2='a'
#exclude3='b'
#exclude4='c'
#exclude5='d'

The examples above did not work.
'NEW' was not replaced with the new text e.g. new line

Note: I dont just want to replace NEW but rather 'NEW'  , which is why I have problems with my usual methods processing batches of files.
0
 
LVL 51

Expert Comment

by:ahoffmann
Comment Utility
# the syntax in the file listed in you last comment is completely different to what you described before
# so it's no suprise that my (and probably all other) suggestions do not work !!
#
# following works for exactly the example you gave above:

find . -type f -exec perl -i.old -pe 's/'"'"'NEW'"'"'/new line/' {} \;

# if it does not work, please copy&paste this example to a file, and try again, twice ...
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility

I posed it as a general example i.e. replacing ANY line of text with another. It was found that SED cannot replace lines encapsulated in quotation. I then specialised it to a more explicit example to deal with the remainig problem of quotations which is where we are now.

I just made it more explicit.
The perl string contains a problem as above

[root@gateway test]# find . -type f -exec perl -i.old -pe 's/'"'"'NEW'"'"'/new line/' {}
find: missing argument to `-exec'
[root@gateway test]#

0
 
LVL 51

Accepted Solution

by:
ahoffmann earned 80 total points
Comment Utility
find . -type f -exec perl -i.old -pe 's/'"'"'NEW'"'"'/new line/' {} \;
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
I just copied  your string and executed it.... Still there is an argument missing to exec switch as mentioned above

[Liebrecht@gateway test]$ find . -type f -exec perl -i.old -pe 's/'"'"'NEW'"'"'/new line/' {}
find: missing argument to `-exec'
[Liebrecht@gateway test]$
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
I just copied  your string and executed it.... Still there is an argument missing to exec switch as mentioned above

[Liebrecht@gateway test]$ find . -type f -exec perl -i.old -pe 's/'"'"'NEW'"'"'/new line/' {}
find: missing argument to `-exec'
[Liebrecht@gateway test]$
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
I just copied  your string and executed it.... Still there is an argument missing to exec switch as mentioned above

[Liebrecht@gateway test]$ find . -type f -exec perl -i.old -pe 's/'"'"'NEW'"'"'/new line/' {}
find: missing argument to `-exec'
[Liebrecht@gateway test]$
0
 
LVL 1

Author Comment

by:dryzone
Comment Utility
My apologies,
I did not use the semicolon.
It works fine
0

Featured Post

Complete Microsoft Windows PC® & Mac Backup

Backup and recovery solutions to protect all your PCs & Mac– on-premises or in remote locations. Acronis backs up entire PC or Mac with patented reliable disk imaging technology and you will be able to restore workstations to a new, dissimilar hardware in minutes.

Join & Write a Comment

Currently, there is not an RPM package available under the RHEL/Fedora/CentOS distributions that gives you a quick and easy way to allow PHP to interface with Oracle. As a result, I have included a set of instructions on how to do this with minimal …
Introduction We as admins face situation where we need to redirect websites to another. This may be required as a part of an upgrade keeping the old URL but website should be served from new URL. This document would brief you on different ways ca…
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now