Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Regular Expression (sed editor)

Posted on 2002-07-22
17
Medium Priority
?
388 Views
Last Modified: 2010-04-21
Hello !

In file "tmp.txt" i want to replace each string
"<TAB or SPACE>source" by string "destination.
I have to do it using sed command.

Following command doesn't work:

sed  s/"[\t, ]source"/"destinations"/g tmp.txt

Can you please help?

Txs,
Alex
0
Comment
Question by:alexgor
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 8
17 Comments
 
LVL 51

Expert Comment

by:ahoffmann
ID: 7171202
sed does not know about \t, you have to use a real TAB
also remove the , in the brackets
0
 

Author Comment

by:alexgor
ID: 7171239
Hello!

I have created file tmp.txt

+-----------------------+
        source
 source
+------------------------+

On this file have run following command:

>>sed s/"[TAB ]source"/"destination"/g tmp.txt

I have received following output:

+-----------------------+
        source
destination
+------------------------+

In other words string "<TAB>source" was not replaced.


Thanks.
0
 
LVL 84

Expert Comment

by:ozo
ID: 7171260
sed 's/[TAB ]source/destination/g'
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:alexgor
ID: 7171321
When command

>>sed 's/[TAB ]source/destination/g' tmp.txt

is used the results is same as for

>>sed s/"[TAB ]source"/"destination"/g tmp.txt

command


Thanks.


0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 7171330
sed 's/[TAB ]*source/destination/g' tmp.txt
# hope you used the TAB key, and not the string literal TAB
0
 

Author Comment

by:alexgor
ID: 7171488
Hello !

I have created file tmp.txt

+-----------------------+
       source #TAB
 source       #SPACE
source        #Nothing
+------------------------+

Running command

>>sed 's/[TAB ]*source/destination/g' tmp.txt

creates following output

+-----------------------+
       destination #TAB
destination       #SPACE
destination        #Nothing
+------------------------+

The desired output is:

+-----------------------+
destination #TAB
destination       #SPACE
source        #Nothing
+------------------------+

And as I understand following command should be used:

>>sed 's/[TAB ]source/destination/g' tmp.txt

But this command creates following output:

+-----------------------+
       source #TAB
destination       #SPACE
source        #Nothing
+------------------------+

In other words string "<TAB>source" is not found.

Thanks.




0
 

Author Comment

by:alexgor
ID: 7171493
In file tmp.txt in the last comment
there is space before beginning of the second line

+-----------------------+
|      source #TAB
| source       #SPACE
|source        #Nothing
+------------------------+



0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 7171501
  sed 's/[TAB ]*source/destination/g' tmp.txt
still should do it, but you may try:
   sed 's/\([TAB ]*source\)/destination/g' tmp.txt
0
 

Author Comment

by:alexgor
ID: 7171664
Hello !

As I understand * signs
"Maximal match zero or more of previous char" and i
need "Maximal match one or more of previous char"

Thanks,
Alex

0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 7172223
sed 's/[TAB ][TAB ]*source/destination/g' tmp.txt
0
 

Author Comment

by:alexgor
ID: 7173658
Hello AHoffman !

Thanks for your answer. My last problem is TAB matching.
If i create file tmp.txt

+-----------------------------------------
       source #There is tab before source
+-----------------------------------------

and run following command

>>sed 's/[TAB]source/destination/g' tmp.txt

I receive following output

+-----------------------------------------
       source #There is tab before source
+-----------------------------------------

When I expect following output

+-----------------------------------------
destination #There is tab before source
+-----------------------------------------

I have tryed also:

>>sed 's/\tsource/destination/g' tmp.txt

This command doesn't work too.

Thanks,
Alex




0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 7173680
again, \t does not work in sed (probably in modern GNU sed). Dot.

if   sed 's/[TAB]source/destination/g' tmp.txt
did not substitute, then the pattern  [TAB]source  did not match. Dot. Try pattern   TABsource   or   TAB*source
If all fail, have a look at your file what's really there:

   od -c tmp.txt
0
 

Author Comment

by:alexgor
ID: 7183347
Hello AHoffman !

sed 's/[TAB]source/destination/g' tmp.txt

and

sed 's/TABsource/destination/g' tmp.txt

and

sed 's/TAB*source/destination/g' tmp.txt

don't work.


Output of command "od -c tmp.txt" is following:

0000000  \t   s   o   u   r   c   e       #   T   h   e   r   e       i
0000020   s       t   a   b       b   e   f   o   r   e       s   o   u
0000040   r   c   e  \n
0000044

Thanks,
Alex





0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 7183751
all variants work for me on any OS with your example
2 possibilities:
  1. you have a corrupted sed
  2. you did not use a real TAB (0x09) in your sed command
     (still asked this silly question)
0
 

Author Comment

by:alexgor
ID: 7183792
Hello AHoffman !

Thank you for your patience, I am new Unix user.

I'm sorry, I have indeed used string literal TAB.

But if I try to use a real TAB key after

>>sed 's/

I receive following error:

"s/ not found"

Note that I'm using Linux OS, and I am doing it on PC,
not on Silicon Graphics or something like that.

Thanks,
Alex
0
 
LVL 51

Accepted Solution

by:
ahoffmann earned 2000 total points
ID: 7183812
Linux, and your shell is bash ... damn, you need to key in the TAB as follows:

     Ctrl-V TAB

means hit Ctrl key together with v key, then hit TAB key
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 7184807
things could be so simple, just look at my first 2 comments :-))
Tnaks for the A.
0

Featured Post

Tech or Treat! - Giveaway

Submit an article about your scariest tech experience—and the solution—and you’ll be automatically entered to win one of 4 fantastic tech gadgets.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Hello fellow BSD lovers, I've created a patch process for patching openjdk6 for BSD (FreeBSD specifically), although I tried to keep all BSD versions in mind when creating my patch. Welcome to OpenJDK6 on BSD First let me start with a little …
Let's say you need to move the data of a file system from one partition to another. This generally involves dismounting the file system, backing it up to tapes, and restoring it to a new partition. You may also copy the file system from one place to…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:

604 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question