背景
只希望在由美元符号分隔的文本中用美元符号替换句号(从来不跨越行)。例如:
Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$.
问题
以下正则表达式几乎可以工作,但是太简单了:
/([[:alnum:]])\.([[:alnum:]])/g
如果在分隔符($
)之外存在匹配,那么会替换太多。
以下指标如下:
/\$.*?\$/g
比赛和组分隔字符串:
姓名:$annie.bettie.cindy.dannie.ellie$.只有$a$名称。$a.b.c.d.e.f$.
问题
如何组合这两个正则表达式,以便可以用另一个字符串替换句点?例如:
Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$.
最终将成为:
Names: `r v$annie$bettie$cindy$dannie$ellie`. Only `r v$a` names. `r v$a$b$c$d$e$f`.
我遇到的麻烦是匹配分隔点。
正则表达式将从运行bash的终端通过管道传输到sed。
发布于 2016-09-28 09:52:40
这可能对您有用(GNU sed):
sed -r ':a;s/^(([^$]*\$[^$.]*\$)*[^$]*\$[^$.]*)\./\1\n/;ta;s/(\$[^$]*)\$/`r v\1`/g;y/\n/$/' file
用换行符替换组中的所有句点。插入组前缀和后缀文字,然后将换行符转换为美元。
发布于 2016-09-28 16:06:19
$ cat ip.txt
Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$.
$ perl -pe '
BEGIN
{
sub f
{
$a = $_[0] =~ tr/./$/r;
$a =~ s/^/`r v/;
$a =~ s/.$/`/;
return $a;
}
}
s/\$.*?\$/f($&)/ge
' ip.txt
Names: `r v$annie$bettie$cindy$dannie$ellie`. Only `r v$a` names. `r v$a$b$c$d$e$f`.
f
对$sometext$
字符串执行必要的转换--首先将.
音译为$
,然后将一些字符串添加到开头,最后删除最后一个字符,用所需的格式替换。BEGIN
块中,该块在逐行处理输入文件之前执行。
s/\$.*?\$/f($&)/ge
将提取$sometext$
模式并传递给f
子例程。Perl知道如何称呼它为e
标志。-p
开关意味着输入行在所有命令之后都会被打印出来。https://stackoverflow.com/questions/39739391
复制相似问题