Visit Our UNIX and Linux User Community


SED: Can't Repeat Search Character in SED Output


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers SED: Can't Repeat Search Character in SED Output
# 8  
Old 09-16-2009
@rhetoric101

Definitely I can tell you, what is the logic mistake in your code.

Your code is,
Code:
sed '
s/>[^>]*<\//\n&/g
:loop
s/\(\n>[^>]*\)_\([^>]*<\/\)/\1_Q\2/   
t loop
s/\n//g' a

In your code,

s/\(\n>[^>]*\)_\([^>]*<\/\)/\1_Q\2/ this line substitutes _ to _Q from right side ( not from left side).

1. In the first iteration, it will substitute This_is_a_test to This_is_a_Qtest
2. In 2nd iteration, it will substitute This_is_a_Qtest to This_is_a_QQtest
3. In the third iteration, it will substitute This_is_a_QQtest to This_is_a_QQQtest
and it will go keep on like this, it never ends.....

This is the reason that your solution works when you replace only with Q, not with _Q.

You can see how the sed substitues,by executing the following code....
Code:
sed '
s/>[^>]*<\//\n&/g
:loop
s/\(\n>[^>]*\)_\([^>]*<\/\)/\1_Q\2/p ## prints the pattern space.
t loop
s/\n//g' input

Hope this clarifies your question...
# 9  
Old 09-17-2009
Additional Question

Thanks for the explanations and sample script showing that I was creating an infinite loop!

I'm not sure if I need to start a new thread, but I noticed that the code suggested is unable to accomplish the task if the second tag is on a new line. For example:
Code:
Input:
<MY_BIG_TAG>This_is_a_test
</MY_BIG_TAG>
 
Code:
 
sed '
s/>[^>]*<\//\n&/g
:loop
s/\(\n>[^>]*\)_\([^>]*<\/\)/\1_Q\2/   
t loop
s/\n//g' a

Do I need to have separate sed lines: one to find cases that fit the normal model where the start and end tags are on the same line and a second sed command that looks for those instances in which the line contains a start tag but ends with a newline character?

---------- Post updated 09-17-09 at 11:33 AM ---------- Previous update was 09-16-09 at 05:14 PM ----------

This may not be very elegant, but it seems to work:

Code:
Input
 
<MY_BIG_TAG>This_is_a_test</MY_BIG_TAG>
<MY_SECOND_BIG_TAG>This_is_a_second_test_where_end_tag_is_on_next_line
</MY_SECOND_BIG_TAG>
 
Code
 
#/usr/bin/sh
#Script goal: replace all underscores between tags with "_Q"
#
#The first section handles lines containing both a start and end tag.
sed '
s/\(<[^>]*>\)\([^>]*\)\(<[^>]*>\)/\1\n\2\3/g
:loop
s/\n\([^<_]*\)_/\1_Q\n/g
/\n[^<_]*_/b loop
s/\n//g 
# The second section handles lines only containing a start tag.
s/\(<[^>]*>\)\([^>]*\)\($\)/\1\n\2\3/g
:loop
s/\n\([^<_]*\)_/\1_Q\n/g
/\n[^<_]*_/b loop
s/\n//g' test1.htm
 
Output
 
<MY_BIG_TAG>This_Qis_Qa_Qtest</MY_BIG_TAG>
<MY_SECOND_BIG_TAG>This_Qis_Qa_Qsecond_Qtest_Qwhere_Qend_Qtag_Qis_Qon_Qnext_Qline
</MY_SECOND_BIG_TAG>

Thanks again for helping me get through this!
 

Previous Thread | Next Thread
Test Your Knowledge in Computers #996
Difficulty: Medium
Major Unix vendors, including Sun Microsystems, HP, IBM, and SGI, have been selling virtualized hardware since before 1990.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to repeat a character in a field if it's a single character?

I have a csv dataset like this : C,rs18768 G,rs13785 GA,rs1065 G,rs1801279 T,rs9274407 A,rs730012 I'm thinking of use like awk, sed to covert the dataset to this format: (if it's two character, then keep the same) CC,rs18768 GG,rs13785 GA,rs1065 GG,rs1801279 TT,rs9274407... (7 Replies)
Discussion started by: nengcheng
7 Replies

2. Shell Programming and Scripting

awk sed to repeat every character on same position from the upper line replacing whitespace

Hello is it possible with awk or sed to replace any white space with the previous line characters in the same position? I am asking this because the file I have doesn't always follow a pattern. For example the file I have is the result of a command to obtain windows ACLs: icacls C:\ /t... (5 Replies)
Discussion started by: nakaedu
5 Replies

3. Shell Programming and Scripting

sed searches a character string for a specified delimiter character, and returns a leading or traili

Hi, Anyone can help using SED searches a character string for a specified delimiter character, and returns a leading or trailing space/blank. Text file : "1"|"ExternalClassDEA519CF5"|"Art1" "2"|"ExternalClass563EA516C"|"Art3" "3"|"ExternalClass305ED16B8"|"Art9" ... ... ... (2 Replies)
Discussion started by: fspalero
2 Replies

4. Shell Programming and Scripting

Sed: delete on each line before a character and after a character

Hi there, A total sed noob here. Is there a way using sed to delete everything before a character AND after another character on each line in a file? The deletion should also delete the indicating characters(here: an opening and a closing parenthesis). The original file would look like... (3 Replies)
Discussion started by: bnbsd
3 Replies

5. Shell Programming and Scripting

sed help - search/copy from one file and search/paste to another

I am a newbie and would like some help with the following - Trying to search fileA for a string similar to - AS11000022010 30.4 31.7 43.7 53.8 60.5 71.1 75.2 74.7 66.9 56.6 42.7 32.5 53.3 I then want to replace that string with a string from fileB - ... (5 Replies)
Discussion started by: ncwxpanther
5 Replies

6. Shell Programming and Scripting

In Sed how can I replace starting from the 7th character to the 15th character.

Hi All, Was wondering how I can do the following.... I have a String as follows "ACCTRL000005022RRWDKKEEDKDD...." This string can be in a file called tail.out or in a Variable called $VAR2 Now I have another variable called $VAR1="000004785" (9 bytes long), I need the content of... (5 Replies)
Discussion started by: mohullah
5 Replies

7. Shell Programming and Scripting

sed to delete character 0 only when it's on its own?

Hi all I am trying to get my head around doing the following.... I have an input field that could contain either a number a blank field or a whitespace field. What I want to do is delete a 0 (zero) if it's on its own or leading the number. So:- \t0 delete the zero 0 delete the... (8 Replies)
Discussion started by: Bashingaway
8 Replies

8. Shell Programming and Scripting

use SED to replace repeat statements

Hi I need to write a script that read a input file that had same statement repeatedly to replace only 2nd & 5th time repeated statements (ex: This is UNIX forum) with another statement ( UNIX forum threads in Shell programming) with out modifying 1st,3,4th repeated statements. I am planning to do... (2 Replies)
Discussion started by: watsup
2 Replies

9. Shell Programming and Scripting

repeat character with printf

It's all in the subject. I try to figure out how to repeat a character a number of time with printf. For example to draw a line in a script output. Thks (13 Replies)
Discussion started by: ripat
13 Replies

10. Shell Programming and Scripting

Use sed to delete a character

I built a 12 million record file and made a mistake, one field is 1 character too long. The record is 40 bytes and ends always in 999. I am trying to delete the 37 character in each record. Is this possible without doing a cut and paste. (1 Reply)
Discussion started by: bthomas
1 Replies

Featured Tech Videos