使用sed在特定块的花括号之前添加新行

时间:2017-07-18 06:50:42

标签: regex sed

我的python代码如下所示:

def one():
    #lines of code
    context = {
        #lines of code
    }

def two():
    #lines of code
    context = {
        #lines of code
    }
    context.up({ #lines 
    })

我想在关闭大括号之前的函数二的上下文部分添加“Some new line”,如下所示:

def one():
    #lines of code
    context = {
        #lines of code
    }

def two():
    #lines of code
    context = {
        #lines of code
        Some new line
    }
    context.up({ #lines 
    })

如何使用sed做到这一点?

我尝试了以下命令:

sed -i '/^def two.*context={/,/^[[:space:]]}/{s/^\([[:space:]]*\)}/\1some new line\n&/;}' file

但它似乎没有任何改变。

1 个答案:

答案 0 :(得分:0)

这可能适合你(GNU sed):

sed '/def two/,/^\s*context\>/!b;/^\s*context\>/!b;:a;n;/^\s*}/!ba;i some new line' file

将范围限制为def two并在context读取行内,直到结束}并插入新行。

第一个sed指令是正则表达式范围,即如果行不在def twocontext之间,则照常打印它们,但不要使用任何sed指令进一步处理它们(b表示打破任何进一步的命令)。同样,下一个正则表达式会忽略除包含context的行之外的所有行。从该地址打印模式空间(PS)中的当前行,并使用下一行(n)填充PS。如果该行不包含}跳回(ba)到位置:a。否则插入(i)一些新文本,然后打印PS的内容。

保留缩进使用:

sed '/def two/,/^\s*context\b/!b;/^\s*context\b/!b;:a;n;/^\s*}/!h;//!ba;x;s/\S\+.*/some new line with indent/p;g' file