In want to replace a function in a file by another. I have this :
File1.cpp:
void Component::initialize()
{
my_component = new ComponentClass();
}
and File2.cpp:
void Component::initialize()
{
if (doInit)
{
my_component = new ComponentClass();
}
else
{
my_component.ptr = null;
}
}
I've try to write a script but my grep does not provide a result :
Old=$(grep -Eo "void Component::initialize(\n|.)*(^})*?" file1.cpp)
echo "Old=$Old" # empty variable
# My purpose is to do this :
New=$(grep -Eo "void Component::initialize(\n|.)*(^})*?" file2.cpp)
sed -i "s/$Old/$New/g" file1.cpp
CodePudding user response:
#!/usr/bin/awk -f
/^void Component::initialize\(\)$/ {
temp = $0
while (!/^}/ && getline > 0)
temp = temp ORS $0
if (NR == FNR) {
new = temp
nextfile
}
$0 = new
}
NR != FNR
Usage:
awk -f script.awk file{2,1}.cpp
CodePudding user response:
Please bear with me here.
There is a generic approach to solving this which is presented here, in section 4.23.3 .
The below script attempts to incorporate and demonstrate that approach.
#!/bin/bash
DBG=1
###
### Code segment to be replaced
###
file1="File1.cpp"
rm -f "${file1}"
cat >"${file1}" <<"EnDoFiNpUt"
void Component::initialize()
{
my_component = new ComponentClass();
}
EnDoFiNpUt
test ${DBG} -eq 1 && echo "fence 1"
###
### Code segment to be used as replacement
###
file2="File2.cpp"
rm -f "${file2}"
cat >"${file2}" <<"EnDoFiNpUt"
void Component::initialize()
{
if (doInit)
{
my_component = new ComponentClass();
}
else
{
my_component.ptr = null;
}
}
EnDoFiNpUt
test ${DBG} -eq 1 && echo "fence 2"
###
### Create demo input file
###
testfile="Test_INPUT.cpp"
rm -f "${testfile}"
{
echo "
other code1()
{
doing other things
doing more things
doing extra things
}
"
cat "${file1}"
echo "
other code2()
{
creating other things
creating more things
creating extra things
}
"
} >>"${testfile}"
test ${DBG} -eq 1 && echo "fence 3"
###
### Create editing specification file
###
{
cat "${file1}"
echo "----"
cat "${file2}"
} >findrep.txt
test ${DBG} -eq 1 && echo "fence 4"
###
### sed script to create editing instructions to apply aove editing specification file
###
cat >"blockrep.sed" <<"EnDoFiNpUt"
#SOURCE: https://www.linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq4_013.html
#
# filename: blockrep.sed
# author: Paolo Bonzini
# Requires:
# (1) blocks to find and replace, e.g., findrep.txt
# (2) an input file to be changed, input.file
#
# blockrep.sed creates a second sed script, custom.sed,
# to find the lines above the row of 4 hyphens, globally
# replacing them with the lower block of text. GNU sed
# is recommended but not required for this script.
#
# Loop on the first part, accumulating the `from' text
# into the hold space.
:a
/^----$/! {
# Escape slashes, backslashes, the final newline and
# regular expression metacharacters.
s,[/\[.*],\\&,g
s/$/\\/
H
#
# Append N cmds needed to maintain the sliding window.
x
1 s,^.,s/,
1! s/^/N\
/
x
n
ba
}
#
# Change the final backslash to a slash to separate the
# two sides of the s command.
x
s,\\$,/,
x
#
# Until EOF, gather the substitution into hold space.
:b
n
s,[/\],\\&,g
$! s/$/\\/
H
$! bb
#
# Start the RHS of the s command without a leading
# newline, add the P/D pair for the sliding window, and
# print the script.
g
s,/\n,/,
s,$,/\
P\
D,p
#---end of script---
EnDoFiNpUt
test ${DBG} -eq 1 && echo "fence 5"
sed --debug -nf blockrep.sed findrep.txt >custom.sed
test ${DBG} -eq 1 && echo "fence 6"
if [ -s custom.sed ]
then
more custom.sed
echo -e "\t Hit return to continue ..." >&2
read k <&2
else
echo -e "\t Failed to create 'custom.sed'. Unable to proceed!\n" >&2
exit 1
fi
testout="Test_OUTPUT.cpp"
sed -f custom.sed "${testfile}" >"${testout}"
test ${DBG} -eq 1 && echo "fence 7"
if [ -s "${testout}" ]
then
more "${testout}"
else
echo -e "\t Failed to create '${testout}'.\n" >&2
exit 1
fi
Unfortunately, what they presented doesn't seem to work. The execution log for the above is as follows:
fence 1
fence 2
fence 3
fence 4
fence 5
sed: file blockrep.sed line 19: unterminated `s' command
fence 6
Failed to create 'custom.sed'. Unable to proceed!
Maybe an expert out there can resolve the logic error in the imported blockrep.sed script. That would have broad application and be beneficial for many, including the OP and myself.