Home > Back-end >  Replace string which is two lines previous to matched pattern
Replace string which is two lines previous to matched pattern

Time:11-24

I have a big config.js file and I would like to replace default:false, to default:true, which is on top of field:'$scope.keepEffort'. I tried multiple sed command solutions but nothing seems to work.

                    {
                            default:false,
                            enabled:true,
                            field:'criticalPath',
                            filter:false,
                            filterValue:'',
                            id:'show-critical-path',
                            operator:'colorize'
                    },{
                            default:false,
                            enabled:true,
                            field:'$scope.keepEffort',
                            filter:false,
                            filterValue:'',
                            id:'effort-constant',
                            operator:'var'
                    },{
                            default:false,
                            enabled:true,
                            field:'$scope.automaticProgress',
                            filter:false,
                            filterValue:'',
                            id:'automatic-progress',
                            operator:'var'
                    },{
                            default:false,
                            enabled:true,
                            field:'groupView',
                            filter:false,
                            filterValue:'',
                            id:'gantt-group-view',
                            operator:'var'
                    },{

CodePudding user response:

This is a job for awk. The following does not attempt to match the single quotes since doing so requires some shell quoting that obfuscates the solution. Also, a trailing { is printed. That is easy enough to remove, and the code for doing so is omitted for clarity:

awk '/field:.\$scope.keepEffort/{gsub("default:false","default:true")}1' RS=\{ ORS=\{ input-file

The idea is simply to separate the records by { and then perform the substitution (via gsub) only on records that match the desired line.

CodePudding user response:

This might work for you (GNU sed):

sed ':a;/{/{n;:b;N;/}/!bb;/\$scope.keepEffort/s/\(default:\)false,/\1true,/;ba}' file

Gather up lines between { and } and if those lines contain $scope.keepEffort replace default:false by default:true.

N.B. The addition of the n after matching { which allows the matching of }. Also, the return to :a after gathering a collection so as to be able to match another {.

  • Related