Can sed replace every 2 instances it finds in a file? Pattern.


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Can sed replace every 2 instances it finds in a file? Pattern.
# 15  
Old 03-07-2010
Quote:
Originally Posted by Franklin52
I had something similar to that in mind with a mod operator but with NR:
Code:
awk '/PORT/ && gsub("PORT",i){i+=!(NR%n)}1' i=4000 n=3 file

Regards
NR won't work in this case, though. NR will increment for every line regardless of whether a PORT substituion occured. The "substitution" counter needs to be something independent of NR (j in my version).

On an unrelated note, since gsub returns the number of substitutions made, we can further reduce the code to:
Code:
awk 'gsub(/PORT/,i){i+=!(++j%n)}1' i=1 n=2 file

Like the earlier versions of this approach, it treats multiple substitutions on a single line as one. That's probably a bug. Though if we can be certain that only one instance of PORT will occur on a line, then it's fine, and as a bonus we can reduce by one more character:

Code:
awk 'sub(/PORT/,i){i+=!(++j%n)}1' i=1 n=2 file

And that concludes this episode of OCD AWKing. Thank you for tuning in. Smilie

Cheers,
Alister

Last edited by alister; 03-07-2010 at 10:52 AM..
# 16  
Old 03-07-2010
Quote:
Originally Posted by alister
NR won't work in this case, though. NR will increment for every line regardless of whether a PORT substituion occured. The "substitution" counter needs to be something independent of NR (j in my version).
Oh my bad you're right, I was using the example file of post #10 of TonyFullerMalv Smilie

Quote:
Originally Posted by alister
Like the earlier versions of this approach, it treats multiple substitutions on a single line as one. That's probably a bug. Though if we can be certain that only one instance of PORT will occur on a line, then it's fine, and as a bonus we can reduce by one more character:

Code:
awk 'sub(/PORT/,i){i+=!(++j%n)}1' i=1 n=2 file

And that concludes this episode of OCD AWKing. Thank you for tuning in. Smilie

Cheers,
Alister
Very niceSmilie!
# 17  
Old 03-07-2010
The following correctly handles multiple instances of "PORT" on a single line:
Code:
awk '{while (sub(/PORT/,i)) i+=!(++j%n)}1' i=1 n=1 data

Finally, we can put this one to bed. Smilie
Alister
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Replace particular words in file based on if finds another words in that line

Hi All, I need one help to replace particular words in file based on if finds another words in that file . i.e. my self is peter@king. i am staying at north sydney. we all are peter@king. How to replace peter to sham if it finds @king in any line of that file. Please help me... (8 Replies)
Discussion started by: Rajib Podder
8 Replies

2. UNIX for Beginners Questions & Answers

sed replace pattern

I have a file with multiple lines, all in the same format. For each line, I need to replace the sequence of digits after the last : with a new value, but keep the single quote at the end of the line. Example: Input: ( two lines of file) Name: 'text1:200/text2:1.2.3.4' Name2:... (19 Replies)
Discussion started by: Beginner101
19 Replies

3. Shell Programming and Scripting

Pattern replace from a text file using sed

I have a sample text format as given below <Text Text_ID="10155645315851111_10155645333076543" From="460350337461111" Created="2011-03-16T17:05:37+0000" use_count="123">This is the first text</Text> <Text Text_ID="10155645315851111_10155645317023456" From="1626711840902323"... (3 Replies)
Discussion started by: my_Perl
3 Replies

4. Shell Programming and Scripting

sed command to replace two character pattern with another pattern

Not able to paste my content. Please see the attachment :-( (2 Replies)
Discussion started by: vivek d r
2 Replies

5. Shell Programming and Scripting

sed finds nothing but it changes file's timestamp

I must go through some files to change a certain string within text files to another string. I use openSUSE and folders are mounted by cifs. Text to be replaced (only in .m extension) is U:\FOLDER and new string is N: That works fine with spaces in directory names etc., but this process ... (5 Replies)
Discussion started by: Pappa41
5 Replies

6. Shell Programming and Scripting

Replace a pattern in a file with a generated number using sed or awk

my file has thousands of line but let me show what i want to achieve... here is one line from that file cat fileName.txt (2,'','user3002,user3003','USER_DATA_SINGLE',1,0,0,'BACKUP',2,NULL,0,450,NULL,NULL,'','2011-05-10... (13 Replies)
Discussion started by: vivek d r
13 Replies

7. UNIX for Dummies Questions & Answers

Using sed command to remove multiple instances of repeating headers in one file?

Hi, I have catenated multiple output files (from a monte carlo run) into one big output file. Each individual file has it's own two line header. So when I catenate, there are multiple two line headers (of the same wording) within the big file. How do I use the sed command to search for the... (1 Reply)
Discussion started by: rebazon
1 Replies

8. Shell Programming and Scripting

How to replace the last pattern using sed?

myfile: AAAaaa BBBbbb CCCccc AAAeee DDDddd how to replace the last AAA as EEEEE using sed? like this: AAAaaa BBBbbb CCCccc EEEEEeee DDDddd (14 Replies)
Discussion started by: vistastar
14 Replies

9. Shell Programming and Scripting

pattern replace inside text file using sed

Hi, I have a situation where I want to replace some occurrences of ".jsp" into ".html" inside a text file. For Example: If a pattern found like <a href="http://www.mysite.com/mypage.jsp"> it should be retained. But if a pattern found like <a href="../mypage.jsp"> it should be changed to... (4 Replies)
Discussion started by: meharo
4 Replies

10. Shell Programming and Scripting

SED Search Pattern and Replace with the Pattern

Hello All, I have a string "CP_STATUS OSSRC_R6_0_Shipment_R1H_CU AOM_901046 R1H_LLSV1_2008031", and I just want to extract LLSV1, but I dont get the expected result when using the sed command below. # echo "CP_STATUS OSSRC_R6_0_Shipment_R1H_CU AOM_901046 R1H_LLSV1_2008031" | awk '{print... (4 Replies)
Discussion started by: racbern
4 Replies
Login or Register to Ask a Question