使用 sed 命令替换动态字

使用 sed 命令替换动态字

我有一个要求,我们需要替换文件中的单词,每次执行脚本时该单词都可能不同,文件的内容是

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 in sed,[^\s]将匹配除\and之外的任何字符s

1 假设PERL_UNICODE环境变量未设置

答案3

我提出这一点,假设“class”始终存在并且位于行的开头:

$ sed 's/^class [^ ]*/class RequiredContent/'
class RequiredContent > Something

  • [^ ]*将“class”后面所有非空格的内容替换为“class”加上所需的新字符串。

相关内容