Regular Expression (sed editor)

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
alexgorAsked:
Who is Participating?
 
ahoffmannConnect With a Mentor Commented:
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
 
ahoffmannCommented:
sed does not know about \t, you have to use a real TAB
also remove the , in the brackets
0
 
alexgorAuthor Commented:
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
Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

 
ozoCommented:
sed 's/[TAB ]source/destination/g'
0
 
alexgorAuthor Commented:
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
 
ahoffmannCommented:
sed 's/[TAB ]*source/destination/g' tmp.txt
# hope you used the TAB key, and not the string literal TAB
0
 
alexgorAuthor Commented:
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
 
alexgorAuthor Commented:
In file tmp.txt in the last comment
there is space before beginning of the second line

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



0
 
ahoffmannCommented:
  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
 
alexgorAuthor Commented:
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
 
ahoffmannCommented:
sed 's/[TAB ][TAB ]*source/destination/g' tmp.txt
0
 
alexgorAuthor Commented:
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
 
ahoffmannCommented:
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
 
alexgorAuthor Commented:
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
 
ahoffmannCommented:
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
 
alexgorAuthor Commented:
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
 
ahoffmannCommented:
things could be so simple, just look at my first 2 comments :-))
Tnaks for the A.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.