Using sed to delete string between delimiters


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Using sed to delete string between delimiters
# 1  
Old 11-13-2007
Java Using sed to delete string between delimiters

Hi There!
I have the following string

Quote:
P1|10,9:12/123456789|,10:1|11,10:60|15,9:5/12345|,10:1|
which i need to convert to

Quote:
P1|12/123456789|1|60|5/12345|1|
i.e. between each occurence of the delimiter ('|' in this case), i need to delete all characters from the '|' to the ':' so that |10,9:12/xxx| becomes |12/xxx|

How can i do this using sed?

Thanks in advance!
# 2  
Old 11-13-2007
I'm rustic, I'm using "base algorithmic" to resolve problems.
So, you can adapt it to any language, I hope ! Smilie

Code:
#!/bin/ksh

a="P1|10,9:12/123456789|,10:1|11,10:60|15,9:5/12345|,10:1|"
savea=$a

while [ "$a" != "" ]
do
        b=$(echo $a | cut -s -d'|' -f1)
        c=$(echo $b | cut -s -d: -f2)

        if [ "$c" = "" ] ; then
                c=$b
        fi

        if [ "$z" != "" ] ; then
                z=$z"|"$c
        else
                z=$c
        fi

        a=$(echo $a | cut -s -d'|' -f2-)
done

echo a=$savea
echo z=$z

Output :
Code:
a=P1|10,9:12/123456789|,10:1|11,10:60|15,9:5/12345|,10:1|
z=P1|12/123456789|1|60|5/12345|1

Hope it will help you ! Smilie
# 3  
Old 11-13-2007
try
Code:
> echo 'P1|10,9:12/123456789|,10:1|11,10:60|15,9:5/12345|,10:1|'|sed -e "s_|[^|]*:_|_g"
P1|12/123456789|1|60|5/12345|1|

# 4  
Old 11-13-2007
Nice, but very difficult to understand for a newbie. SmilieSmilie

Quote:
Originally Posted by Klashxx
try
Code:
> echo 'P1|10,9:12/123456789|,10:1|11,10:60|15,9:5/12345|,10:1|'|sed -e "s_|[^|]*:_|_g"
P1|12/123456789|1|60|5/12345|1|

# 5  
Old 11-13-2007
sed -e "s_|[^|]*:_|_g"

s is used to match a regular expression (for simplicity, to match some part of the given text) and replace it with some other text. Here's what the manual says:
Code:
       s/regexp/replacement/
	      Attempt  to match regexp against the pattern space.  If success-
	      ful,  replace  that  portion  matched  with  replacement.    The
	      replacement may contain the special character & to refer to that
	      portion of the pattern space  which  matched,  and  the  special
	      escapes  \1  through  \9	to refer to the corresponding matching
	      sub-expressions in the regexp.

Underscores (_) are used here to define the regular expression that is used (usually front shash (/) is used)

|[^|]*: matches text starting with | and ending with colon (Smilie. This text is replaced by |

g tells sed to do match-and-replace globally. that is, keep repeating this at every possible place in the input text
# 6  
Old 11-13-2007
indeed quite difficult to understand!

could you explain what's happening there?


EDIT: didn't see yogesh had already replied...all makes sense now, thanks guys!!!
# 7  
Old 11-14-2007
Quote:
Originally Posted by [CODE
|[^|]*: [/CODE] matches text starting with | and ending with colon :
One slight clarification, the point here is the use of the regex:
Code:
[^|]

Lets see an example:
Code:
> echo 'P1|10,9:12/123456789|,10:1|11,10:60|15,9:5/12345|,10:1|'|sed -e "s_|.*:_|_g"
P1|1|

|.*: matchs any character (starting with | and ending with : ) and the result is not what we expect.
Code:
 echo 'P1|10,9:12/123456789|,10:1|11,10:60|15,9:5/12345|,10:1|'|sed -e "s_|*:_|_g"    
P1|10,9|12/123456789|,10|1|11,10|60|15,9|5/12345|,10|1|

|*: nothing happens here because we are looking for any number (including zero) of the single character | that immediately precedes the asterisk.

So the trick to solve the problem is match any number of any character between | and : except | and that's what we are getting with |[^|]*:

Regards
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

sed delete leading spaces in a .csv if not in a string

Solaris, ksh I have a .csv file I am trying to clean up before loading into the database. The file contains comma separated columns that have leading spaces which I need to remove. The trouble is, some columns that should not be touched are strings which happen to have the same pattern in them. ... (4 Replies)
Discussion started by: gary_w
4 Replies

2. Shell Programming and Scripting

delete the line with a particular string in a file using sed command.

Hello, I want to delete all lines with given string in file1 and the string val is dynamic. Can this be done using sed command. Sample: vars="test twinning yellow" for i in $vars do grep $i file1 if then echo "Do Nothing" else sed `/$i/d` file1 fi done Using the above... (5 Replies)
Discussion started by: PrasadAruna
5 Replies

3. Shell Programming and Scripting

Delete string between 3rd tab and first pattern with SED

Hello, I have this sentence :Pattern1 Pattern2 Pattern3 Pattern4-which-contains-HELLO-string-and-other-stuff-and-second-HELLO-and-third-HELLO I want to delete everything between the 3rd tab (\t) and the FIRST pattern "HELLO" of the line. Result expected is : Pattern1 ... (7 Replies)
Discussion started by: theclem35
7 Replies

4. Shell Programming and Scripting

SED help delete characters in a string

Hi Please help me to refine my syntax. I want to delete the excess characters from the out put below. -bash-3.00$ top -b -n2 -d 00.20 |grep Cpu|tail -1 | awk -F ":" '{ print $2 }' | cut -d, -f1 4.4% us now i want to delete the % and us. How wil i do that to make it just 4.4. Thanks (7 Replies)
Discussion started by: redtred
7 Replies

5. UNIX for Dummies Questions & Answers

Delete string between delimiters with sed

Hi, I need to delete all text between "|" delimiters. The line in text file typically looks like this: 1014182| 13728 -rw-r--r-- 1 imac1 staff 7026127 2 okt 2010 |/Users/imac1/Music/iTunes/iTunes Media/Music/Various Artists/We Are the World_ U.S.A. for Africa/01 We Are the World.mp3... (2 Replies)
Discussion started by: andrejm
2 Replies

6. Shell Programming and Scripting

sed delete wildcard within a string

Hi I would like to batch delete the "note" entry from bib files. The start would be defined by "note ={" and the end by "}." (see example bib entry below). I tried the following command which does not have any effect: cat input.bib| sed -e 's/note = {.*}.//' > output.bib Any help would... (2 Replies)
Discussion started by: gerggeismann
2 Replies

7. Shell Programming and Scripting

SED delete string from till problems

Hi i have a file which contains 2 lines, line 1 is static data. line 2 is a very large string(over 3000char or much more). in that string are tags which i want to delete. e.g. <order1>123</order1><tag1>data</tag1><new>1</new><order2>124</order2><tag1>data</tag1> all one one line. now i... (5 Replies)
Discussion started by: subby80
5 Replies

8. Shell Programming and Scripting

delete multiline string from file using sed.

Hi, I have file which has the following content... GOOD MORNING **********WARNING********** when it kicks from the kickstart, sshd daemon should start at last. (WHEN KICKING ITSELF, NOT AFTER KICKING). /etc/rc3.d/S55sshd ( run level specification for sshd is 55, now I would want to... (4 Replies)
Discussion started by: skmdu
4 Replies

9. Shell Programming and Scripting

using sed command to delete a string spanning multiple lines

file1 contains the following data sssssssssss firstline secondline pppppppppp ssssssssss Using sed comamnd i am trying to delete firtsline secondline. so, output should be sssssssssss pppppppppp ssssssssss I tried in the following the way, but it is not working. sed ... (9 Replies)
Discussion started by: radha.kalivar
9 Replies

10. UNIX for Dummies Questions & Answers

Using sed to delete a string?

Hi all! Here is my problem : I have a string like the following : 20030613170404;BAN_CAV ; starting script Loader.sh on ; 13/06/2003 at ; 17;04;03 I want to eraze all characters located after "Loader.sh", because there are unuseful. I tried to use sed...but it didnt work....i guess i... (1 Reply)
Discussion started by: HowardIsHigh
1 Replies
Login or Register to Ask a Question