Find and replace using sed


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Find and replace using sed
# 8  
Old 11-25-2013
In general awk is much better suited for these kind of substitutions, but if for some reasen sed is still your prefered choice you could try something like this:
Code:
sed 's/\([0-9]*,[0-9]*,66,[A-Z]*,\).*/\177/' file

# 9  
Old 11-27-2013
Thanks all,

Akshay, find and replace is working well, when I pass multiple inputs using while loop having concerns. The pattern lines are getting eliminated.

Code:
file
1,2,33,C,B 
3,5,66,K,R
1,2,33,H,M 
3,5,66,M,C
6,9,66,J,F
4,8,55,H,P
5,7,44,N,U
 
input.txt
66
55
 
CODE:
awk '{print $1}' input.txt | while read line 
do 
awk -F, '$5 = $3 == find ? replace : $5 ' OFS=, find=$line replace=77  file >>Output.txt
done<inputfile
 
Output.txt
1,2,33,H,M   --->loop 1 
4,8,55,H,P    --->loop 1 
5,7,44,N,U   --->loop 1 
1,2,33,C,B    --->loop 2
3,5,66,K,R   --->loop 2
1,2,33,H,M   --->loop 2 
3,5,66,M,C  --->loop 2 
6,9,66,J,F   --->loop 2 
5,7,44,N,U  --->loop 2

And as we know it will append into the Output.txt file.


Is there a way to get the below output, when passing values in while loop?
Code:
1,2,33,C,B 
3,5,66,K,77
1,2,33,H,M 
3,5,66,M,77
6,9,66,J,77
4,8,55,H,77
5,7,44,N,U

# 10  
Old 11-27-2013
You are appending in every iteration below one does your job


Try :


Code:
$ awk -F,  'FNR==NR{A[$1]++;next}A[$3]{$5=replace}1' replace=77 OFS=\, input.txt file >output.txt

$ cat output.txt
1,2,33,C,B 
3,5,66,K,77
1,2,33,H,M 
3,5,66,M,77
6,9,66,J,77
4,8,55,H,77
5,7,44,N,U

awk is the best tool for this type of work, if you still wants to do using looping you can do something like this, its bit lengthy even
Code:
#!/bin/bash

replace_file=input.txt
input_file=file
out_file=output.txt
replace=77

n=0
while read main ; do

       while read sub; do

        main=$(echo $main | sed 's/\(.*,.*,'$sub',.*,\).*/\1'$replace'/')
   # OR main=$(echo $main | awk -F, -v val=$sub '$3==val{$5=replace}1' replace=$replace OFS=\, )

       done < "$replace_file"

       [ $n -eq 0 ] && echo $main >$out_file || echo $main >>$out_file

       n=$((n+1))

done < "$input_file"


Last edited by Akshay Hegde; 11-27-2013 at 01:33 PM.. Reason: more way
This User Gave Thanks to Akshay Hegde For This Post:
# 11  
Old 11-27-2013
Akshay, thanks it working as expected Smilie
# 12  
Old 11-27-2013
Quote:
Originally Posted by Akshay Hegde
[..]
Try :[/B]

Code:
$ awk -F,  'FNR==NR{A[$1]++;next}A[$3]{$5=replace}1' replace=77 OFS=\, input.txt file >output.txt

[..]
It is more efficient to use $3 in A instead of A[$3]:
Code:
awk 'FNR==NR{A[$1]; next} $3 in A{$5=replace}1' replace=77 FS=, OFS=, input.txt file

Then there is no need for A[$1]++ which saves an addition operation for every line. Also, using A[$3] creates an extra empty array element for every $3 that does not exist in array A while reading the second file..
This User Gave Thanks to Scrutinizer For This Post:
# 13  
Old 12-04-2013
Code:
file
1,2,33,C,B 
3,5,66,K,R
1,2,33,H,M 
3,5,66,M,C
6,9,66,J,F
4,8,155,H,P
5,7,44,N,U
 
input.txt
066
55

When I passing my input with 0 in beginning, it searching for the exact "066" and not considering the below lines in file to replace
Code:
3,5,66,K,R
3,5,66,M,C
6,9,66,J,F

And when I passing only 66 in file input.txt, when the file contain 066 it should consider for replacing
Code:
input.txt
66
55
 
file
1,2,33,C,B 
3,5,066,K,R
1,2,33,H,M 
3,5,066,M,C
6,9,066,J,F
4,8,155,H,P
5,7,44,N,U


And also my input file has 55 which do not want to match with 155 "4,8,155,H,P" in file
I used double quotes for $3 in the below but isn't gave me o/p, how to achieve this with
Code:
awk -F,  'FNR==NR{A[$1]++;next}A[$3]{$5=replace}1' replace=77 OFS=\, input.txt file >output.txt

or
Code:
awk -F,  'FNR==NR{A[$1]++;next}A[$3]{$5=replace}1' replace=77 OFS=\, input.txt file >output.txt


Last edited by Scrutinizer; 12-05-2013 at 03:12 AM.. Reason: code tags
# 14  
Old 12-05-2013
Hi, try this fix:
Code:
awk 'FNR==NR{A[$1+0]; next} $3+0 in A{$5=replace}1' replace=77 FS=, OFS=, input.txt file

This User Gave Thanks to Scrutinizer For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

sed find 2 strings and replace one

Hi Everyone, I want to find this 2 strings in a single line a file and replace the second string. this is the line i need to find <param name="user" value="CORE_BI"/> find user and CORE_BI and replace only CORE_BI with admin so finally the line should look like this. <param... (5 Replies)
Discussion started by: shajay12
5 Replies

2. Shell Programming and Scripting

Find and replace using sed

Hi All, I have a file as shown below: myFile.dat #---------------------------------------------------------- dataFile { Name shiva; location Delhi; travelID IDNumber; } 4 ( 560065 700007 100001 200002 )... (8 Replies)
Discussion started by: linuxUser_
8 Replies

3. Shell Programming and Scripting

Find and replace using sed command

The content of the file filea.txt is as follows. --------- case $HOSTNAME in aaa) DS_PARM_VALUE_SET=vsDev APT_Configuration_File=/appl/infoserver/Server/Configurations/2node.apt ;; bbb) DS_PARM_VALUE_SET=vsQA... (3 Replies)
Discussion started by: kmanivan82
3 Replies

4. Shell Programming and Scripting

Find and Replace with sed

Hi, I have a file such that: tart*)*98'bank'ksb64bank)(tart2d&f44bank I want to replace to: (only between tart and bank) tart*)*98'replaced'ksb64bank)(tart2d&f44replaced Thanks. (6 Replies)
Discussion started by: tara123
6 Replies

5. Shell Programming and Scripting

find and replace using SED

I need to do a find and replace. I tried below logic but getting warnings Could you please help? a=`echo "<!DOCTYPE aaaaa bbbbb \"sample.dtd\">"` b="<!DOCTYPE aaaaa bbbbb \" /a/b/c/datain/d_k/sample.dtd \">" echo $a | sed -e "s/$a/$b/" > c.txt getting the following error sed:... (1 Reply)
Discussion started by: kmanivan82
1 Replies

6. Shell Programming and Scripting

find and replace with sed

Hi, I have two files file1 :> val="10" port="localhost:8080" httpadd="http:\\192.168.0.239" file2 :> val=${val} port=${port} httpadd=${httpadd} fileloc=${fileloc} file3(or file2) should have following output(input from fileone) file3 (8 Replies)
Discussion started by: nitin.pathak
8 Replies

7. Shell Programming and Scripting

find and replace with SED

Hello all I have a file with a lot of records...Each one have a ID like this: 000000001 LDR L -----nam--2200217Ia-45e0 000000001 891 000000001 892 000000001 893 and so on then you have the second record: 000000002 LDR L -----nam--2200208Ia-15e0 000000002 891 000000002... (5 Replies)
Discussion started by: ldiaz2106
5 Replies

8. Shell Programming and Scripting

Help with find and Replace using sed

I have to update a paramater (dateMemLimit) present in a file, with a date (YYYYMMDD) equal to 5 days before the sysdate. The parameter will be in the following format. dateMemLimit = 20091201 Please note the blank spaces present between 'dateMemLimit' &'=' and between '='... (4 Replies)
Discussion started by: rajesh8s
4 Replies

9. Shell Programming and Scripting

find and replace using sed

Hello Everybody, I am doing something like this on Redhat Linux h=`cut -d"." -f4 file1` s=`cut -d"." -f4 file2` sed "s/$h/$s/g" file3 but this is not working but if giving constant value its working, for ex. sed "s/93/$h/g" file3 help... Thanks for looking into my question (2 Replies)
Discussion started by: arvind_aks15
2 Replies

10. Shell Programming and Scripting

Find a pattern and replace using sed.

Hi I need to help on finding the below pattern using sed <b><a href="/home/document.do?assetkey=x-y-abcde-1&searchclause=photo"> and replace as below in the same line on the index file. <b><a href="/abcde.html"> thx in advance. Mari (5 Replies)
Discussion started by: maridhasan
5 Replies
Login or Register to Ask a Question