正则表达式在sed中重复缩进

amp*_*ent 2 regex solaris sed

这就是我想要做的:

如果我遇到类似的模式

someVarX: val1
Run Code Online (Sandbox Code Playgroud)

我想插入

someVarY: val2
Run Code Online (Sandbox Code Playgroud)

在下一行

......但这里是捕捉:

someVarX:val1可以在空格(缩进)之前有一个数字,计算0到N之间的任何位置,我也想在下一行重复那个精确的缩进.因此,如果someVarX:val1有3个前面的空格,那么我也希望someVarY:val2有3个前面的空格.

这是我试过的:

s/\n( +)someVarX: val1/\n${1}someVarX: val1\n${1}someVarY: val2/
Run Code Online (Sandbox Code Playgroud)

希望$ {1}将搜索模式中的捕获组插入到替换字符串中,但得到:

sed: command garbled: ...
Run Code Online (Sandbox Code Playgroud)

操作系统是SunOS 5.10.我无法跑sed --version,它告诉我选项--version是非法的.

任何的想法?

Tho*_*hor 6

假设您的输入类似于:

<< EOF > infile
someVarX: val1
   someVarX: val1
 someVarX: val1
    someVarX: val1
EOF
Run Code Online (Sandbox Code Playgroud)

你可以像这样完成它(用GNU sed ERE测试):

<infile sed -r 's/^( *)someVarX: .*/&\n\1someVarY: val2/'
Run Code Online (Sandbox Code Playgroud)

与BRE和更多可移植选项相同(也使用FreeBSD sed测试):

sed '/^ *someVarX: .*/ { G; s/^\( *\)someVarX: .*/&\1someVarY: val2/; }' infile
Run Code Online (Sandbox Code Playgroud)

输出:

someVarX: val1
someVarY: val2
   someVarX: val1
   someVarY: val2
 someVarX: val1
 someVarY: val2
    someVarX: val1
    someVarY: val2
Run Code Online (Sandbox Code Playgroud)

注意,用于^将正则表达式锚定在行的开头,而不是\n因为sed从未在输入中看到换行符.也可以使用*,除非你总是在行的开头有空格.

&替换中的ampersand()由整个匹配替换,backreference(\1)插入适当数量的空间.