Regex 是否用另一个字符替换正则表达式匹配中的所有字符?

Regex 是否用另一个字符替换正则表达式匹配中的所有字符?,regex,sed,posix,Regex,Sed,Posix,我正在对一个文件进行分析,我想在将该文件向下移动之前屏蔽一些字符(同时保留其原始字节数)。例如,给定file.txt: Hello there Cory Klein Have fun Hello there Samantha Rodgers 使用sed编写正则表达式以匹配名称并用XXXXX替换它们非常简单: $ sed -e "s/\(Hello there \).*/\1XXXXX/" file.txt Hello there XXXXX Have fun Hello there XXXXX

我正在对一个文件进行分析,我想在将该文件向下移动之前屏蔽一些字符(同时保留其原始字节数)。例如,给定
file.txt

Hello there Cory Klein
Have fun
Hello there Samantha Rodgers
使用
sed
编写正则表达式以匹配名称并用
XXXXX
替换它们非常简单:

$ sed -e "s/\(Hello there \).*/\1XXXXX/" file.txt
Hello there XXXXX
Have fun
Hello there XXXXX
但是我想用
X
字符替换名称中的每个字符,如下所示:

Hello there XXXX XXXXX
Have fun
Hello there XXXXXXXX XXXXXXX
如何用另一个字符替换与正则表达式匹配的所有字符


任何常规的POSIX工具都可以
sed
awk
perl
,等等。我确信我可以编写一个简单的python脚本来实现这一点,但我很好奇,仅使用regex是否可以做到这一点,这可能更简洁。如果是这样的话,我很想了解如何在将来将这个概念应用到其他地方。

使用sed,您需要使用地址过滤掉不包含
Hello here
的行:

/Hello there/{...}
然后用一个
x
替换
Hello here
后面的任何一个非空白字符:

s/(^.*Hello there *)?[^[:space:]]/\1x/g
我们将使用
\1
保留
Hello here
及其前面的字符

整个命令将是:

$ sed -r '/Hello there/{s/(^.*Hello there *)?[^[:space:]]/\1x/g}' file
Hello there xxxx xxxxx
Have fun
Hello there xxxxxxxx xxxxxxx

Perl支持其正则表达式集的高级功能,因此使用Perl可以缩短时间:

perl -pe 's/(Hello there|\G(?!\A)) *\K\S/x/g' file

RegExp细分:

  • 分组的开始
    • Hello there
      Match
      Hello there
    • |
    • \G(?!\A)
      从上一个匹配结束的位置开始匹配
  • 分组结束
  • []*
    匹配任何空格
  • \K
    忘记目前匹配的内容
  • \S
    匹配单个非空白字符

这将继续匹配
Hello there
之后的所有非空白字符,并使用
g
标志将它们替换为
x

使用Perl,很容易,
Perl-lpe的s/Hello there\s*\K(.*)/$1=~s#s#x#gr ge'
()。在这种情况下,如何定义名称?在正则表达式中,需要指定要匹配的每个名称或要跳过的每个模式。不清楚您是否打算这样做。GNU只使用了那个,但这是一个很好的解决方案@oguzismail你不应该改变正则表达式。改为使用
sed'/Hello there/s/\(^.*Hello there*\)*[^[:space:]/\1X/g'