一旦评估,我需要替换正则表达式的每个字符,每个字符加上@符号。
例如:
如果正则表达式是: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
Perl救援!
perl -pe 's/(POS[AB])/$1 =~ s:(.):$1@:gr/ge'
/e
将替换解释为代码,它包含另一个替换,用自己替换每个字符加上@
。
在5.14之前的古代珍珠中(即没有qazxsw po修饰符),你需要使用更复杂的一点
/r
回声 “POSA_____POSB” |或 “S / [^] / @ /克”
要么
回声 “POSA_____POSB” |或 “S / [POSAB] / @ /克”
试试这个正则表达式:
perl -pe 's/(POS[AB])/$x = $1; $x =~ s:(.):$1@:g; $x/ge'
输出:
echo "POSA_____POSB" | sed "s/[A-Z]/&@/g"
您可以使用P@O@S@A@_____P@O@S@B@
(第一个匹配子字符串,awk
“sub
”)或sed
(全局替换匹配子字符串,s///
“gsub
”)命令替换正则表达式模式。正则表达式本身在sed
和s///g
之间没有区别。在你的情况下你想要:
编辑:编辑以匹配评论
以下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]
以分别匹配小写,大写字母和数字。
请注意,您可以使用[A-Z]
来否定字符集:[0-9]
也适用于此特定情况。
否定意味着:匹配“[]”之间的任何字符。打开'['后,'^'字符必须作为第一个字符。
也可以直接表明你想要一次匹配一个字符与[^]
或[^_]
。
另请注意,[POSAB]?
的某些实现可能需要使用[POSAB]{1}
开关来使用扩展(更复杂)的regexp。
通过给出的示例,您可以使用
sed
对于更复杂的表达式,这将失败。
当您的输入没有-r
和echo "POSA_____POSB" | sed -r 's/POS([AB])/P@O@S@\1@/g'
时,您可以使用
\v