如何将捕获组与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,我想使用捕获组,这是行不通的如何将捕获组与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右侧的转义字符//
我做错了什么?必须用反斜杠\…\,将括号转义,以用作分组 见第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