我有:
Aenean placerat >> /example/alpha.txt
est et rutrum ultrices >> /example/beta.txt
dolor nibh ultricies nulla >> /example/gamma delta.txt
我需要:
Aenean placerat >> \/\e\x\a\m\p\l\e\/\a\l\p\h\a\.\t\x\t
est et rutrum ultrices >> \/\e\x\a\m\p\l\e\/\b\e\t\a\.\t\x\t
dolor nibh ultricies nulla >> \/\e\x\a\m\p\l\e\/\g\a\m\m\a\ \d\e\l\t\a\.\t\x\t
显然这是行不通的,但我找不到实现这一点的方法......
's/(.*) >> (.)*/$1 >> \\$2/gm'
3条答案
按热度按时间wgeznvg71#
一个快速而简单的方法是在正则表达式替换中应用一个正则表达式替换。
/e
(eval)修饰符告诉Perl将RHS作为代码来计算。注意内部替换运算符s###
上使用了可选的分隔符,并且使用/r
修饰符只返回值(无论如何我们不能修改只读变量)。\K
转义符允许我们"保留"正则表达式匹配的剩余部分。这可以用作简单的一行代码:
t8e9dugd2#
您可以匹配第一次出现〉〉之后的每个字符,然后使用
\K
清除到目前为止匹配的内容,并结合使用\G
来匹配它之后的每个字符。说明
(?:
交替的非捕获组^.*?>>\h*
匹配到第一次出现>>
,后跟可选的水平空格字符|
或\G(?!^)
Assert上一个匹配项的末尾位置,而不是字符串的开头位置)
关闭非捕获组\K
忽略目前匹配的内容.
匹配单个字符请参阅regex demo或perl demo。
在替换中,使用前面带有
\
的完全匹配范例
输出量
ecfsfe2w3#
一种方法是将行一分为二,然后仅对右侧应用替换:
输出: