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