我有一个要求,我们需要替换文件中的单词,每次执行脚本时该单词都可能不同,文件的内容是
class DynamicContentToReplace > Something
这里我需要使用sed命令将[DynamicContentToReplace]替换为RequiredContent。 [DynamicContentToReplace] 可以包含除空格之外的所有内容。
我们可以采取的假设是该文件仅包含这样一个包含class
单词的行
所需输出
class RequiredContent > Something
我已尝试以下命令
sed -e "s/\(class \)\([^\s]+\)/\1RequiredContent/"
,但它仍然无法替换内容。我在这里缺少什么。我已经经历过这也发帖。但无法得到解决方案。
答案1
- 对于基本正则表达式,您需要转义
+
量词。 \+
是一个 GNU 扩展,您可能需要使用*
或\{1,\}
来代替。- 使用
[^[:space:]]
或 简单地[^ ]
代替[^\s]
.使用 GNU,sed
您还可以使用\S
除空白之外的任何内容。 - 无需捕获第二组,因为您不在
\2
任何地方使用。 - 如果只有一个
sed
命令,则不需要-e
- 您可能想
^
在前面添加class
而不是替换不需要的东西,例如instance=my_class_something()
使用:
sed 's/^\(class \)[^[:space:]]*/\1RequiredContent/'
或使用扩展正则表达式 ( sed -E
):
sed -E 's/^(class )\S+/\1RequiredContent/'
答案2
既然您使用的是 perl 正则表达式运算符,为什么不直接使用 perl 呢?
perl -pe 's/\bclass\s+\K\S+/RequiredContent/g' < your-file
\b
是单词边界运算符,只要 之前没有单词字符就会匹配class
。\s
匹配任何空白字符(仅限于 ASCII 字符,因为我们没有告诉perl
以用户的语言环境或 UTF-8 来解码输入,因此输入被解释为以 ISO8859-1 编码(幸好 0xa0 字节,ISO8859-1 的非-只要您不将标志添加u
到该s
替换中,打破空格编码就不会被视为空白)。\K
重置匹配字符串的开头,因此只有之后匹配的内容才会被替换,因此您无需捕获之前的内容即可将其添加回替换中。\S
是任何非空白字符。在 perl 中,这相当于[^\s]
while insed
,[^\s]
将匹配除\
and之外的任何字符s
。
1 假设PERL_UNICODE
环境变量未设置
答案3
我提出这一点,假设“class”始终存在并且位于行的开头:
$ sed 's/^class [^ ]*/class RequiredContent/'
class RequiredContent > Something
[^ ]*
将“class”后面所有非空格的内容替换为“class”加上所需的新字符串。