2

这就是我想要做的:

如果我遇到这样的模式

someVarX: val1

我想插入

someVarY: val2

在下一行

...但这里有一个问题:

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

这是我尝试过的:

s/\n( +)someVarX: val1/\n${1}someVarX: val1\n${1}someVarY: val2/

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

sed: command garbled: ...

操作系统 os SunOS 5.10。我无法运行sed --version,它告诉我选项 --version 是非法的。

任何的想法?

4

4 回答 4

6

假设您的输入类似于:

<< EOF > infile
someVarX: val1
   someVarX: val1
 someVarX: val1
    someVarX: val1
EOF

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

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

BRE 和更便携的选项也是如此(也使用 FreeBSD sed 进行了测试):

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

输出:

someVarX: val1
someVarY: val2
   someVarX: val1
   someVarY: val2
 someVarX: val1
 someVarY: val2
    someVarX: val1
    someVarY: val2

请注意,用于^将正则表达式锚定在行首,而不是\n因为 sed 永远不会在输入中看到换行符。也使用*, 除非你总是在行首有空格。

替换中的和号 ( &) 被整个匹配替换,反向引用 ( \1) 插入适量的空间。

于 2012-11-29T16:42:34.560 回答
2

这就是最终奏效的方法:

        s/^\( *\)someVarX: val1/&\
\1someVarY: val2/

它必须在 sed S&R 规范文件的两行中完成,我们称之为它snrspec.sed,它还包含其他 S&R 指令:

1,/^END/{
        s/ABC/XYZ/

        ...

        s/^\( *\)someVarX: val1/&\
\1someVarY: val2/

}

然后我打电话给sed:

sed -f snrspec.sed inputfile.txt > outputfile.txt

但是,如果有人知道如何做,我更愿意在一行中完成,因为它显然会更优雅。但上述方法奏效了,我进行了大规模的 S&R 操作。

于 2012-11-29T18:58:04.503 回答
1

这适用于任何 sed:

sed -n 'p;s/^\([ \t]*\)someVarX: val1/\1someVarY: val2/p' file

如果你想要更可扩展的东西,这里是 awk 解决方案:

awk '1; /^[ \t]*someVarX: val1/{ sub(/[^ \t].*/,"someVarY: val2"); print}' file
于 2012-11-29T18:35:11.223 回答
1

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

sed '/someVarX: val1/{h;G;s//someVarY: val2/2}' file
于 2012-11-29T20:25:16.133 回答