Search and Replace in a new FILE.


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Search and Replace in a new FILE.
# 1  
Old 06-17-2016
Search and Replace in a new FILE.

Hi,

more data.txt
Quote:
white=black
red=green
blue=pink
more srstring.sh
Code:
input="data.txt"
while IFS= read -r var
do
startdirectory=$loc
search=$(echo $var | awk -F'=' '{print $1}')
replace=$(echo $var | awk -F'=' '{print $2}')
find "/tmp/config" -type f -exec grep -l "$search" {} + |
while read file
do if sed -e "s#$search#$replace#g" "$file" > /tmp/tmpfile.tmp
then mv /tmp/tmpfile.tmp "$file"
echo $file
printf "Modified: %s\n" "$file"
fi
done
rm -f /tmp/tmpfile.tmp
done < "$input"

srstring.sh reads data.txt line by line and replaces right side value with the left in any file found under /tmp/config folder.

So.
Quote:
more /tmp/config/myfolder/hello.txt BEFORE running the srstring.sh

I saw the following colors in the book viz white, red and blue
Quote:
more /tmp/config/myfolder/hello.txt AFTER running the srstring.sh

I saw the following colors in the book viz black, green and pink
Now, my requirement is rather than replacing & saving the values in the the same file i would like to have the original files untouched .. rather save the replace file as <original-filename>_tmp.replace

So, after running the srstring.sh

Quote:
more /tmp/config/myfolder/hello.txt BEFORE running the srstring.sh

I saw the following colors in the book viz white, red and blue
Quote:
more /tmp/config/myfolder/hello.txt_tmp.replace AFTER running the srstring.sh

I saw the following colors in the book viz black, green and pink
Can you let me know how can i easily tweak my code to achieve the same ? Also, it will be great if it runs on Linux as well as Solaris.

Last edited by mohtashims; 06-17-2016 at 01:00 PM..
# 2  
Old 06-17-2016
I would use the following sed script to produce another sed script:
Code:
sed -n 's/..*=.*/s=&=g/p' < data.txt > data.sed

then run this on on your input file(s)
Code:
...
while read file
do
  sed -f data.sed "$file" > "$file"_tmp.replace
done

# 3  
Old 06-17-2016
Try this boiled down attempt - might not work on Solaris:

Code:
find /tmp/config -type f -exec grep -lE "(white|red|blue)[^=]" {} + |  awk '
FNR == 1        {FC++
                }
FC == 1         {ARGV[ARGC++] = $1
                 next
                }
FC == 2         {RP[$1] = $2
                 next
                }
FNR == 1        {NFN = FILENAME ".tmp.replace"
                }
                {for (r in RP) gsub (r, RP[r])
                 print > NFN     
                }
' - FS="=" data.txt


EDIT: Thinking twice, I don't really like that. Let me work on sth. that extracts the keywords for the grep from the data file...
# 4  
Old 06-17-2016
Quote:
Originally Posted by RudiC
Try this boiled down attempt - might not work on Solaris:

Code:
find /tmp/config -type f -exec grep -lE "(white|red|blue)[^=]" {} + |  awk '
FNR == 1        {FC++
                }
FC == 1         {ARGV[ARGC++] = $1
                 next
                }
FC == 2         {RP[$1] = $2
                 next
                }
FNR == 1        {NFN = FILENAME ".tmp.replace"
                }
                {for (r in RP) gsub (r, RP[r])
                 print > NFN     
                }
' - FS="=" data.txt

EDIT: Thinking twice, I don't really like that. Let me work on sth. that extracts the keywords for the grep from the data file...
I don't want to restrict to these three "white|red|blue"

The data.txt may contain as many replace string as we like.

---------- Post updated at 12:55 PM ---------- Previous update was at 12:34 PM ----------

Quote:
Originally Posted by MadeInGermany
I would use the following sed script to produce another sed script:
Code:
sed -n 's/..*=.*/s=&=g/p' < data.txt > data.sed

then run this on on your input file(s)
Code:
...
while read file
do
  sed -f data.sed "$file" > "$file"_tmp.replace
done

How will this work ?

Code:
sed -f data.sed "$file" > "$file"_tmp.replace

It will work for the first string replacement.

But for the entry string replacement after reading from the data.txt it will not update "$file"_tmp.replace rather take "$file" as the input again and override the first replaced string.

So, it needs to update the same "$file"_tmp.replace for each entry it pickes from the data.txt. Note: data.txt can have as many replace entries as the user likes to feed-in.
# 5  
Old 06-17-2016
No it will do all replacements at once; you do not need an outer loop for each pattern.
A drawback is, it will produce a new file even if nothing was changed.
An improvement is: also produce a grep file
Code:
sed -n 's/..*=.*/s=&=g/p' < data.txt > data.sed
sed -n 's/=.*//p' < data.txt > data.grep

find "/tmp/config" -type f -print |
while read file
do
  if grep -f data.grep "$file" >/dev/null
  then
    sed -f data.sed "$file" > "$file"_tmp.replace
  fi
done

---------- Post updated at 13:40 ---------- Previous update was at 13:28 ----------

In case /usr/bin/grep does not take the -f, use /usr/xpg4/bin/grep
This User Gave Thanks to MadeInGermany For This Post:
# 6  
Old 06-18-2016
Quote:
Originally Posted by mohtashims
.
.
.
I don't want to restrict to these three "white|red|blue"

The data.txt may contain as many replace string as we like.
.
.
.
So - how would you go about it? Please show us some own effort to extend the proposal to suit your needs.
# 7  
Old 06-18-2016
As stated before in post#3, the grep string should be constructed from the data file. This is a bit tricky, and I'm not sure it will run on ALL versions of awk. So, don't complain if it doesn't - give it a try and come back with the results.

Code:
awk '
NR == FNR       {if (NR == 1) ARGV[ARGC++] = XFN = FILENAME
                 RP[$1] = $2
                 next
                }
!L              {for (r in RP) P = P "|" r
                 P = "(" substr (P, 2) ")"
                 cmd = "find /tmp/config -type f -exec grep -lE \"" P "[^=]\" {} + "
                 while (cmd | getline X) ARGV[ARGC++] = X
                 L = 1
                }

FNR == 1        {NFN = FILENAME ".tmp.replace"
                 AFN = FILENAME
                }

AFN == XFN      {next}

                {for (r in RP) gsub (r, RP[r])
                 print >  NFN
                }
' FS="=" data.txt


Last edited by RudiC; 06-18-2016 at 06:13 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Search and replace in file

hi All i'm new to shell/bash scripting and need help to write a script. question: i have a file of 100's of line, i need to replace all zeros in that file with its respective position, starting from 0 to 23 and remove the remaining sample file is like. Enter the date in the format... (12 Replies)
Discussion started by: sunnu2u86
12 Replies

2. Shell Programming and Scripting

Nested search in a file and replace the inner search

Hi Team, I am new to unix, please help me in this. I have a file named properties. The content of the file is : ##Mobile props east.url=https://qa.east.corp.com/prop/end west.url=https://qa.west.corp.com/prop/end south.url=https://qa.south.corp.com/prop/end... (2 Replies)
Discussion started by: tolearn
2 Replies

3. Shell Programming and Scripting

Search for a string in a file and replace

I have file t1.log Contents of t1.log file Number of records processed: Number of records rejected: Error : xyz .......... abc .......... aaa _] start time : end time : Please let me know how i can remove the contents highlighted in red in the t1.log file. Thanks Sam (3 Replies)
Discussion started by: sam777
3 Replies

4. Emergency UNIX and Linux Support

Search and replace in text file

Hi, I have gigabytes of text files that I need to search for "&" and replace with "&amp". Is there a way to do this efficiently (like sed command)? Hope you could help. Thanks. (17 Replies)
Discussion started by: daytripper1021
17 Replies

5. Shell Programming and Scripting

Optimised way for search & replace a value on one line in a very huge file (File Size is 24 GB).

Hi Experts, I had to edit (a particular value) in header line of a very huge file so for that i wanted to search & replace a particular value on a file which was of 24 GB in Size. I managed to do it but it took long time to complete. Can anyone please tell me how can we do it in a optimised... (7 Replies)
Discussion started by: manishkomar007
7 Replies

6. Shell Programming and Scripting

Help on search and replace in a file

Hi all, The operating system is Solaris 10 I have example line here below I need to change the stat1 to stat2 using a shell script. search for space(" ") and replace with "\ " Stat1 --- /data/Sat Night Stay.txt Stat2 --- /data/Sat\ Night\ Stay.txt Thanks Firestar. (1 Reply)
Discussion started by: firestar
1 Replies

7. UNIX for Advanced & Expert Users

search and replace in a file

I have a file (say file1.txt) and I have to search for a line which has a text replace it and replace another string too in the same line. Eg: file1.txt -------- x='hai' y='world' z='unix' x='hai' y='world' x='hai' z='perl' y='world' z="world" k="junk" b="world" z='perl' x='hai'... (3 Replies)
Discussion started by: ammu
3 Replies

8. Shell Programming and Scripting

search and replace in a file

Hi I have to search & replace column in the file.For example ..below iam having File1. in which 3rd column ...if it is A it should be 'ACT' if P it should be 'PAD' and if it ils D it should be 'DEC' I have to pass column no ,value and to be converted value as variables in to the... (2 Replies)
Discussion started by: satyam_sat
2 Replies

9. Shell Programming and Scripting

Search and replace in file..

Hi All, As I'm working on a Unix script... and the requirement is like, I need to search a word and replace it with the another word... for that i'm using SED command.... can anybody give any other alternate for this...? Thanks Amit (2 Replies)
Discussion started by: Amits
2 Replies

10. UNIX for Dummies Questions & Answers

Search and replace in file

Hi guys, I have one file with duplicate string. I want to replace all the occurance of that string with some other string. How can I do that in vi editor? Malay Maru (3 Replies)
Discussion started by: malaymaru
3 Replies
Login or Register to Ask a Question