如何将捕获组与sed一起使用?

如何将捕获组与sed一起使用?,sed,Sed,我试图用sed替换文件中的一些文本,但遇到了问题 sed-ir的/\$hello=true/\1false/'/path/to/my/file.txt给出错误sed:-e表达式1,char 27:s命令的RHS上的引用无效 我想用$hello=false替换$hello=true,所以为了避免两次键入$hello=true,我想使用捕获组,这是行不通的 我做错了什么?必须用反斜杠\…\,将括号转义,以用作分组 见第3.1.2节。s///右侧的转义字符有一个示例: 3.1.2。s右侧的转义字符//

我试图用sed替换文件中的一些文本,但遇到了问题

sed-ir的/\$hello=true/\1false/'/path/to/my/file.txt给出错误sed:-e表达式1,char 27:s命令的RHS上的引用无效

我想用$hello=false替换$hello=true,所以为了避免两次键入$hello=true,我想使用捕获组,这是行不通的


我做错了什么?

必须用反斜杠\…\,将括号转义,以用作分组

见第3.1.2节。s///右侧的转义字符有一个示例:

3.1.2。s右侧的转义字符///

s/find/replace/is中更换零件的右侧 几乎总是一个字符串文字,没有插值 元字符:

  .   ^   $   [   ]   {   }   (   )  ?   +   *   |
插入了三项内容:与&、反向引用和 特殊SED的选项。RHS上的与符号替换为 整个表情在LHS上匹配。从来没有 使用如下分组的原因:

  s/\(some-complex-regex\)/one two \1 three/
随后在第F节GNU sed v2.05及更高版本中:

F.GNU sed v2.05及更高版本

未记录-r开关:

从版本3.02开始,GNU sed有一个未记录的-r开关 4.0版之前未记录,激活扩展常规 表达方式如下:

 ?      -  0 or 1 occurrence of previous character
 +      -  1 or more occurrences of previous character
 |      -  matches the string on either side, e.g., foo|bar
 (...)  -  enable grouping without backslash
 {...}  -  enable interval expression without backslash
使用-r开关助记符:正则表达式时,前缀 这些符号带有反斜杠以禁用特殊含义

有关GNU sed中使用的正则表达式语法的文档,请参阅

5.3基本正则表达式语法概述

\正则表达式\

将内部regexp作为一个整体进行分组,用于:

应用后缀运算符,如abcd*:这将搜索零个或多个完整的“abcd”序列,而abcd*将搜索“abc”,后跟零个或多个出现的“d”。请注意,POSIX 1003.1-2001要求支持abcd*,但许多非GNU实现不支持它,因此它不是通用的可移植的。 使用反向引用,见下文。
必须使用反斜杠\…\,将括号转义,以用作分组

见第3.1.2节。s///右侧的转义字符有一个示例:

3.1.2。s右侧的转义字符///

s/find/replace/is中更换零件的右侧 几乎总是一个字符串文字,没有插值 元字符:

  .   ^   $   [   ]   {   }   (   )  ?   +   *   |
插入了三项内容:与&、反向引用和 特殊SED的选项。RHS上的与符号替换为 整个表情在LHS上匹配。从来没有 使用如下分组的原因:

  s/\(some-complex-regex\)/one two \1 three/
随后在第F节GNU sed v2.05及更高版本中:

F.GNU sed v2.05及更高版本

未记录-r开关:

从版本3.02开始,GNU sed有一个未记录的-r开关 4.0版之前未记录,激活扩展常规 表达方式如下:

 ?      -  0 or 1 occurrence of previous character
 +      -  1 or more occurrences of previous character
 |      -  matches the string on either side, e.g., foo|bar
 (...)  -  enable grouping without backslash
 {...}  -  enable interval expression without backslash
使用-r开关助记符:正则表达式时,前缀 这些符号带有反斜杠以禁用特殊含义

有关GNU sed中使用的正则表达式语法的文档,请参阅

5.3基本正则表达式语法概述

\正则表达式\

将内部regexp作为一个整体进行分组,用于:

应用后缀运算符,如abcd*:这将搜索零个或多个完整的“abcd”序列,而abcd*将搜索“abc”,后跟零个或多个出现的“d”。请注意,POSIX 1003.1-2001要求支持abcd*,但许多非GNU实现不支持它,因此它不是通用的可移植的。 使用反向引用,见下文。
在扩展正则表达式模式下,如果您打算将r转换为-ir,则不必转义括号,但实际上,如果您想要两个选项-i和-r,则必须将它们分开,或者使用-ri而不是-ir,因为后者将-i之后的部分解释为可选的备份后缀

因为-i接受一个可选参数,所以它应该 其他短期期权不得紧随其后:

sed-Ei“…”文件 与-E-i相同,不带备份后缀-文件将在不创建备份的情况下就地编辑。

sed-iE“…”文件 这相当于-in-place=E,创建文件E作为备份 档案


在扩展正则表达式模式下,如果您打算将r转换为-ir,则不必转义括号,但实际上,如果您想要两个选项-i和-r,则必须将它们分开,或者使用-ri而不是-ir,因为后者将-i之后的部分解释为可选的备份后缀

因为-我有选择权 我认为应该 其他短期期权不得紧随其后:

sed-Ei“…”文件 与-E-i相同,不带备份后缀-文件将在不创建备份的情况下就地编辑。

sed-iE“…”文件 这相当于-in-place=E,创建文件E作为备份 档案


你是在Mac上吗?如果你想把r改为-ir,你不必在扩展正则表达式模式下转义括号,但实际上如果你想要两个选项-i和-r,那么你必须将它们分开,或者使用-ri而不是-ir,因为后者将-i之后的部分解释为可选的备份后缀。@luciole75w谢谢,这就解决了问题!如果你想写一个答案,我会接受的:你敢在Mac上吗?你不必在扩展正则表达式模式下转义括号,如果你的意图是将r转换为-ir,但实际上,如果您想要两个选项-i和-r,则必须将它们分开,或者使用-ri而不是-ir,因为后者将-i之后的部分解释为可选的备份后缀。@luciole75w谢谢,这就解决了问题!如果你想写一个答案,我接受:d