【问题标题】:Replace string which is two lines previous to matched pattern替换匹配模式前两行的字符串
【发布时间】:2022-01-02 07:18:29
【问题描述】:

我有一个很大的 config.js 文件,我想将 default:false, 替换为 default:true,,它位于 field:'$scope.keepEffort' 之上。我尝试了多个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'
                    },{

【问题讨论】:

  • 你应该使用jq而不是sed
  • 好吧,我搜索了 jq,发现它是用于 JSON 文件的,但我的配置文件不是 JSON,虽然它看起来像我给出的代码示例,但实际上它是 JavaScript 函数

标签: bash shell sed


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您的解决方案有效,但我是 awk 和 sed 命令的新手,所以我应该如何删除在同一命令中添加的文件中最后一个额外的 {
  • 最后的{ 被添加为最后一行,所以最简单的方法可能是简单地将它传递给sed。例如awk ... | sed '$d'sed 命令将删除最后一行。
【解决方案2】:

这可能对你有用(GNU sed):

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

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

注意在匹配{ 之后添加n 允许匹配}。另外,收集一个集合后返回:a,以便能够匹配另一个{

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 2014-03-22
    • 1970-01-01
    • 2014-08-20
    • 2014-09-03
    • 2013-10-24
    • 2021-01-26
    • 2020-02-15
    • 2020-07-20
    相关资源
    最近更新 更多