如何在评估后处理正则表达式(sed)

问题描述 投票:1回答:5

一旦评估,我需要替换正则表达式的每个字符,每个字符加上@符号。

例如:

如果正则表达式是:POS[AB]

输入文本是:POSA_____POSB

我想得到这个结果:P@O@S@A@_____P@O@S@B@

请使用sed或awk。

我试过这个:

$ echo "POSA_____POSB" | sed "s/POS[AB]/&@/g"

POSA@_____POSB@

$ echo "POSA_____POSB" | sed "s/./&@/g"

P@O@S@A@_@_@_@_@_@P@O@S@B@

但我需要的是:

P@O@S@A@_____P@O@S@B@

先感谢您。

最好的问候,Octavio

regex bash shell ksh
5个回答
1
投票

Perl救援!

perl -pe 's/(POS[AB])/$1 =~ s:(.):$1@:gr/ge'

/e将替换解释为代码,它包含另一个替换,用自己替换每个字符加上@

在5.14之前的古代珍珠中(即没有qazxsw po修饰符),你需要使用更复杂的一点

/r

0
投票

回声 “POSA_____POSB” |或 “S / [^] / @ /克”

要么

回声 “POSA_____POSB” |或 “S / [POSAB] / @ /克”


0
投票

试试这个正则表达式:

perl -pe 's/(POS[AB])/$x = $1; $x =~ s:(.):$1@:g; $x/ge'

输出:

echo "POSA_____POSB" | sed "s/[A-Z]/&@/g"

0
投票

您可以使用P@O@S@A@_____P@O@S@B@ (第一个匹配子字符串,awksub”)或sed(全局替换匹配子字符串,s///gsub”)命令替换正则表达式模式。正则表达式本身在seds///g之间没有区别。在你的情况下你想要:

Solution 1

编辑:编辑以匹配评论

以下sed将替换限定为给定的子字符串(例如'POSA _____ POSB'):

awk

如果您的输入仅包含匹配的字符串,请尝试以下操作:

awk
Explanation:

为了清楚起见,每个动作和明确的 echo "OOPS POSA_____POSB" | awk '{str="POSA_____POSB"}; {gsub(/[POSAB]/,"&@",str)}; {gsub(/'POSA_____POSB'/, str); print $0} ' 分开'{}'。

echo "POSA_____POSB" | awk '{gsub(/[POSAB]/,"&@");}1' 接受3个参数print,其中target必须是可变的(gsub将在原位改变它并在那里存储结果)。

我们使用名为'str'的var并在执行任何替换之前使用value(您的字符串)初始化它。

第二个gsub(pattern, substitution [, target])将修改后的gsub放入gsub(匹配整个记录/行)。

表达式默认为str--它们将匹配可能的最长字符串。

$0引入了要匹配的字符集:任何字符的每个出现都将匹配。上面的表达式表示greedy匹配任何“POSAB”的每个出现。

你的第一个正则表达式没有按预期工作,你告诉[]匹配任何awk结尾的sed(整个字符串一次)。在另一个表达式中,当您使用时,它告诉它匹配任何单个字符(包括“_”):POS(点)。

如果你想推广这个解决方案,你可以使用:[AB]表达式,它将匹配任何'.'[\w][a-zA-Z0-9_][a-z]以分别匹配小写,大写字母和数字。

Solution 2

请注意,您可以使用[A-Z]来否定字符集:[0-9]也适用于此特定情况。

Explanation:

否定意味着:匹配“[]”之间的任何字符。打开'['后,'^'字符必须作为第一个字符。

Sidenotes:

也可以直接表明你想要一次匹配一个字符与[^][^_]

另请注意,[POSAB]?的某些实现可能需要使用[POSAB]{1}开关来使用扩展(更复杂)的regexp。


0
投票

通过给出的示例,您可以使用

sed

对于更复杂的表达式,这将失败。 当您的输入没有-recho "POSA_____POSB" | sed -r 's/POS([AB])/P@O@S@\1@/g' 时,您可以使用

\v
© www.soinside.com 2019 - 2024. All rights reserved.