Segregate file content using sed backreference

I have some text like

EU1BTDAT:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD'
EU1BTDATEST:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD'
EU1CLOSEDATES:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD'
EU1DATED:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD'
EU1DATED.022415:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD'
EU1DATEM:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM'
EU1DATENYSE:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD'
EU1DATEQTRLY:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDQ'
EU1DATEQTRLY:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD'
EU1DATEQTRLY.010416:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM'
EU1DATEQTRLY.010416:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD'
EU1DATEQTRLY.orig:ASSGNDD filename='$SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM'

i want to fetch the 1st word before ":" and the last word after "=".
I believe it can be used using sed back reference.

I have tried using

sed -e "s/([a-z]*)(:)(*)(=)(*)/\1 \4/g" backreftext

but it does not work
also i have tried by adding escape characters.. but veil.
if anyone can help and suggest where i am going wrong.

The output expected as :

EU1BTDAT $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1BTDATEST $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDQ

Try it (GNU sed):

sed -E 's/(^[^:]+):[^=]+=(.*)/\1 \2/'

Your expression is a mess.

Hello gotamp,

Please use code tags as per forum rules for your Inupts/codes shown in your posts not HTML codes. You haven't shown the sample output to us, so based on my assumptions, could you please try following and let me know if this helps you.

awk -vs1="'" -F"=" '{sub(/:.*=/,"=",$0);n=split($2, A,".");sub(s1,X,A[n]);print $1 OFS A[n]}'  Input_file

Output will be as follows.

EU1BTDAT CARDLIB/DATECARD
EU1BTDATEST CARDLIB/DATECARD
EU1CLOSEDATES CARDLIB/DATECARD
EU1DATED CARDLIB/DATECARD
EU1DATED.022415 CARDLIB/DATECARD
EU1DATEM CARDLIB/DATECARDM
EU1DATENYSE CARDLIB/DATECARD
EU1DATEQTRLY CARDLIB/DATECARDQ
EU1DATEQTRLY CARDLIB/DATECARD
EU1DATEQTRLY.010416 CARDLIB/DATECARDM
EU1DATEQTRLY.010416 CARDLIB/DATECARD
EU1DATEQTRLY.orig CARDLIB/DATECARDM

I you do have any other conditions or differenet output then please show us with
sample output and with all conditions too.
EDIT: Seems you have shown your expected output now by editing your post, then following may help you in same.

awk -vs1="'" '{sub(/:.*=/,OFS,$0);gsub(s1,X,$0);print}'   Input_file

Output will be as follows.

EU1BTDAT $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1BTDATEST $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1CLOSEDATES $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATED $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATED.022415 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEM $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
EU1DATENYSE $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDQ
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY.010416 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
EU1DATEQTRLY.010416 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY.orig $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM

Thanks,
R. Singh

Extremely sorry for the inconvenience caused as the expression was a mess due to improper code tags.
I have corrected them now.

@ yazu..
the above code did not work . it says

sed -e 's/(^[^:]+):[^=]+=(.*)/\1 \2/' backreftext
sed: command garbled: s/(^[^:]+):[^=]+=(.*)/\1 \2/

another information : i am using sun solaris system.

uname -a
SunOS simsun2 5.10 Generic_150400-13 sun4u sparc SUNW,SPARC-Enterprise

@RavinderSingh13
the given awk code did not work

awk -vs1="'" -F"=" '{sub(/:.*=/,"=",$0);n=split($2, A,".");sub(s1,X,A[n]);print $1 OFS A[n]}' backreftext
awk: syntax error near line 1
awk: illegal statement near line 1
awk: syntax error near line 1
awk: illegal statement near line 1

May be i am missing something, as i have directly copied and pasted the text.

GNU sed with "-E" (or -r - they are the same) option

For solaris this should work

sed  's!^\([^:]*\):[^=]*=\(.*\)!\1 \2!'
1 Like

many thanks Yazu. it worked now.
however, I am still struggling to understand the logic.
I am sure i will understand, but it will take little time.
I would appreciate if you can point out any URL / Bookname to learn back reference.
Many thanks once again !!!

I learnt sed here (but I read something before - this is good.)

1 Like

many thanks mate !!
Will definitely try out there .once again thanks for the help !!

You could also try the following:

#!/usr/xpg4/bin/sh
echo sed test
sed "s/\(.*\):.*'\(.*\)'$/\1 \2/" backreftext
echo awk test
/usr/xpg4/bin/awk -F "[:']" '{print $1, $(NF - 1)}' backreftext
echo nawk test
awk -F "[:']" '{print $1, $(NF - 1)}' backreftext

which, with your sample input in the file named backreftext , should produce the output:

sed test
EU1BTDAT $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1BTDATEST $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1CLOSEDATES $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATED $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATED.022415 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEM $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
EU1DATENYSE $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDQ
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY.010416 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
EU1DATEQTRLY.010416 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY.orig $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
awk test
EU1BTDAT $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1BTDATEST $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1CLOSEDATES $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATED $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATED.022415 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEM $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
EU1DATENYSE $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDQ
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY.010416 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
EU1DATEQTRLY.010416 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY.orig $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
nawk test
EU1BTDAT $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1BTDATEST $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1CLOSEDATES $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATED $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATED.022415 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEM $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
EU1DATENYSE $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDQ
EU1DATEQTRLY $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY.010416 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM
EU1DATEQTRLY.010416 $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARD
EU1DATEQTRLY.orig $SEQFILES/SUNIA.PJ008202.CARDLIB/DATECARDM

on a Solaris/SunOS system.

This would also work with /bin/sh , bash , or ksh .

Note that you could also get the output RavinderSingh13 showed with awk if you change awk to /usr/xpg4/bin/awk or nawk (as is necessary for almost all awk scripts on Solaris/SunOS systems).