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

Regex 正则表达式在sed中重复缩进,regex,sed,solaris,Regex,Sed,Solaris,这就是我想做的: 如果我遇到这样的模式 someVarX: val1 我想插入 someVarY: val2 在下一行 …但这里有一个陷阱: someVarX:val1可以在空格(缩进)前面有一个数字,该数字在0和N之间的任意位置计数,我还想在下一行重复该精确缩进。因此,如果someVarX:val1前面有3个空格,那么我也希望someVarY:val2前面有3个空格 这就是我所尝试的: s/\n( +)someVarX: val1/\n${1}someVarX: val1\n${1}som

这就是我想做的:

如果我遇到这样的模式

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: ...
操作系统sunos5.10。我无法运行sed--version,它告诉我该选项--version是非法的


有什么想法吗?

假设您的输入与此类似:

<< EOF > infile
someVarX: val1
   someVarX: val1
 someVarX: val1
    someVarX: val1
EOF
输出:

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


替换中的符号(
&
)被整个匹配项替换,而反向引用(
\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

这就是最终成功的原因:

        s/^\( *\)someVarX: val1/&\
\1someVarY: val2/
它必须在sed S&R规范文件的两行上完成,我们称之为
snrspec.sed
,其中还包含其他S&R说明:

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

        ...

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

}
然后我打电话给塞德:

sed -f snrspec.sed inputfile.txt > outputfile.txt
然而,如果有人知道怎么做的话,我更愿意在一行中完成,因为它显然更优雅。但上述方法奏效了,我执行了大规模的S&R操作。

这可能对您有用(GNU-sed):


捕获组的引用方式类似于
\1
。另外,在您的匹配模式中,'\n'是否表示新行?除非您在保持缓冲区上操作,否则这将不起作用。对于您似乎正在尝试的内容(问题中的示例输入和所需输出使这类内容更易于帮助,现在我们必须假设我们知道您希望它如何工作)。是的,
\n
是新行。我还可以如何指示它插入新行?1。请编辑您的问题以包括
uname
sed--version
的结果。某些SED允许在更换零件中使用
\n
。我对
\n
的反对意见是在第一部分,即
s/\n(+)someVar…
中的模式匹配。2.Sed依赖于
\n
来分离每一行以进行处理,它不会位于该行的当前位置。当您将一行保存到保持缓冲区中时,
\n
将在模式匹配端起作用的唯一位置。。。。所以3.您是否正在向我们展示您的完整sed脚本?祝你好运。更新:操作系统Sunos5.10。我无法运行sed——版本,它告诉我这个选项——版本是非法的。大多数人认为整个世界都围绕着Linux。我认为@Thor的便携式答案应该适用于Sun。(在Solaris中使用标记并包括示例输入和所需输出时,您将得到更及时的响应。)Good luckI am在sed S&R文件中设置正则表达式以及其他正则表达式(这很有效)。我尝试了这个,但没有成功:
s/(*)someVarX:val1/\1someVarX:val1&\n\1someVarX:val1/
@foampile:您使用的是基本正则表达式还是扩展正则表达式?另请注意,您正在复制
someVarX
&
将扩展到
\1someVarX:val1
。更改为
s/^(*)someVarX:.*/&\n\1someVarY:val2/
后,我的
命令仍然乱七八糟
@foampile:试试我刚刚添加的更便携的版本。版本中的新行插入位置在哪里?看我刚刚发布的答案一点也不明显,在一行上进行多次替换会更优雅,我认为从文件运行脚本是更明智的方法。
1,/^END/{
        s/ABC/XYZ/

        ...

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

}
sed -f snrspec.sed inputfile.txt > outputfile.txt
sed '/someVarX: val1/{h;G;s//someVarY: val2/2}' file