My file goes like this:
SID_LIST_HOSTNAME_LISTENER_3 =
(SID_LIST =
(SID_DESC =
(SID_NAME = ORA0008)
(ORACLE_HOME = /opt/oracle/product/ORA0008)
(ENVS = "LD_LIBRARY_PATH=/opt/oracle/product/ORA0008/lib")
)
(SID_DESC =
(SID_NAME = ORA0007)
(ORACLE_HOME = /opt/oracle/product/ORA0007)
(ENVS = "LD_LIBRARY_PATH=/opt/oracle/product/DBATST1/lib")
)
(SID_DESC =
(SID_NAME = ORA0006)
(ORACLE_HOME = /opt/oracle/product/ORA0006)
(ENVS = "LD_LIBRARY_PATH=/opt/oracle/product/10.2.0.4.EE.2009Q2a/lib")
)
..
..
I want use awk to add:
(SID_DESC =
(SID_NAME = <SID>)
(ORACLE_HOME = /opt/oracle/product/<SID>)
(ENVS = "LD_LIBRARY_PATH=/opt/oracle/product/10.2.0.4.EE.2009Q2a/lib")
)
immediately after:
SID_LIST_HOSTNAME_LISTENER_3 =
(SID_LIST =
in my input file.
Can someone help me figure out a way to match 2 patterns and then add the lines..
TIA
Gotta be awk? I can do it in sed:
sed '
s/regex_pattern.*/&\
add_line_1\
add_line_2\
add_line_3/
' infile >outfile
This won't match pattern on 2 lines but on 1 line, i.e. if I use:
sed 's/^SID_LIST_.*=$/& \
(SID_LIST =\
(SID_DESC =\
(SID_NAME = <ORACLE_SID>)\
(ORACLE_HOME = \/opt\/oracle\/product\/<ORACLE_SID>)\
)/'
The output shall be:
SID_LIST_HOSTNAME_LISTENER_3 =
(SID_LIST =
(SID_DESC =
(SID_NAME = <ORACLE_SID>)
(ORACLE_HOME = /opt/oracle/product/<ORACLE_SID>)
)
(SID_LIST =
(SID_DESC =
(SID_NAME = ORA0008)
(ORACLE_HOME = /opt/oracle/product/ORA0008)
(ENVS = "LD_LIBRARY_PATH=/opt/oracle/product/ORA0008/lib")
)
(SID_DESC =
(SID_NAME = ORA0007)
...
...
etc.
Whereas I need:
SID_LIST_HOSTNAME_LISTENER_3 =
(SID_LIST =
(SID_DESC =
(SID_NAME = <ORACLE_SID>)
(ORACLE_HOME = /opt/oracle/product/<ORACLE_SID>)
)
(SID_DESC =
(SID_NAME = ORA0008)
(ORACLE_HOME = /opt/oracle/product/ORA0008)
(ENVS = "LD_LIBRARY_PATH=/opt/oracle/product/ORA0008/lib")
)
(SID_DESC =
(SID_NAME = ORA0007)
...
...
Any clues?
---------- Post updated at 08:23 PM ---------- Previous update was at 08:03 PM ----------
Thi works:
sed '/^SID_LIST_.*=$/,/(SID_LIST =$/ s/(SID_LIST =$/& \
(SID_DESC =\
(SID_NAME = <ORACLE_SID>)\
(ORACLE_HOME = \/opt\/oracle\/product\/<ORACLE_SID>)\
)/'
panyam
January 20, 2011, 10:06am
4
awk -v a1="$a" '/SID_LIST_HOSTNAME_LISTENER_3/ {print;c=NR;next} NR==c-1&&/\(SID_LIST/ {print;print a1;c=0;next}1' input_file
Where does "a" holds the needed replacement string.
In sed, you can N when yoou see a promising first line to add the second line (or you can N your way for all lines 2-$ with two lines in the buffer) and then compare across the linefeed. In your case, I would pull all the "(SID_DESC =" through ")" lines into the buffer and then rework the buffer.
sed '
/(SID_DESC =/{
:loop
N
/\n *) *$/!b loop
-- rework buffer substitutions --
}
'