替换匹配模式前两行的字符串

Replace string which is two lines previous to matched pattern

我有一个很大的 config.js 文件,我想将 default:false, 替换为 field:'$scope.keepEffort' 之上的 default:true,。我尝试了多个 sed 命令解决方案,但似乎没有任何效果。

                    {
                            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'
                    },{

这是 awk 的工作。以下不会尝试匹配单引号,因为这样做需要一些 shell 引号来混淆解决方案。此外,还会打印尾随 {。这很容易删除,为清楚起见省略了这样做的代码:

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

这个想法只是简单地用 { 分隔记录,然后仅在与所需行匹配的记录上执行替换(通过 gsub)。

这可能适合您 (GNU sed):

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

收集 {} 之间的行,如果这些行包含 $scope.keepEffortdefault:false 替换为 default:true

N.B。在匹配 { 之后添加 n 允许匹配 }。另外,return 到 :a 后收集一个集合,以便能够匹配另一个 {.