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细分:
分组的开始(
MatchHello there
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'