这就是我想要做的:
如果我遇到类似的模式
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是非法的.
任何的想法?
假设您的输入类似于:
<< 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)插入适当数量的空间.
| 归档时间: |
|
| 查看次数: |
1558 次 |
| 最近记录: |