Solved

Simple file editing question

Posted on 2002-05-31
18
164 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
ID: 7047795
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
ID: 7047859
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
ID: 7048156
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
ID: 7048287
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
ID: 7048969
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
ID: 7049815
find . -type f -exec perl -i -pe 's/(.*entry=)something/$1something-else/' {} \;
0
 
LVL 3

Expert Comment

by:DVB
ID: 7053073
Quote the #: \#
0
 
LVL 1

Author Comment

by:dryzone
ID: 7054316
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
ID: 7054341
> 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
Enterprise Mobility and BYOD For Dummies

Like “For Dummies” books, you can read this in whatever order you choose and learn about mobility and BYOD; and how to put a competitive mobile infrastructure in place. Developed for SMBs and large enterprises alike, you will find helpful use cases, planning, and implementation.

 
LVL 1

Author Comment

by:dryzone
ID: 7055078
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
ID: 7055093
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
ID: 7055888
# 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
ID: 7056597

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
ID: 7056670
find . -type f -exec perl -i.old -pe 's/'"'"'NEW'"'"'/new line/' {} \;
0
 
LVL 1

Author Comment

by:dryzone
ID: 7057172
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
ID: 7057204
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
ID: 7057238
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
ID: 7057329
My apologies,
I did not use the semicolon.
It works fine
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This is the error message I got (CODE) Error caused by incompatible libmp3lame 3.98-2 with ffmpeg I've googled this error message and found out sometimes it attaches this note "can be treated with downgrade libmp3lame to version 3.97 or 3.98" …
I am a long time windows user and for me it is normal to have spaces in directory and file names. Changing to Linux I found myself frustrated when I moved my windows data over to my new Linux computer. The problem occurs when at the command line.…
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…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

920 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

15 Experts available now in Live!

Get 1:1 Help Now