Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在匹配前后替换字符_Perl_Awk_Sed - Fatal编程技术网

Perl 如何在匹配前后替换字符

Perl 如何在匹配前后替换字符,perl,awk,sed,Perl,Awk,Sed,我的文件中有标记。我想用下划线字符替换它之前或之后的任何空格 如何使用sed、awk或perl实现这一点 例如: 注意:我使用的是:,因为空格会被忽略,并带有`(勾号) ::替换为\uuuuuuuuu\uuuuuuuuuuuu ::将替换为\uuuuuuuuuuuuuuuuuuuuu\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu ::将被替换为\uuuuuuuuuuu ::替换为\uuuuuuuuuuuuuuuuuuuuuu 我试过了 $ echo "test test &l

我的文件中有

标记。我想用下划线字符替换它之前或之后的任何空格

如何使用sed、awk或perl实现这一点

例如:

注意:
我使用的是
,因为空格会被忽略,并带有`(勾号)


替换为
\uuuuuuuuu
\uuuuuuuuuuuu


将替换为
\uuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


将被替换为
\uuuuuuuuuuu


替换为

\uuuuuuuuuuuuuuuuuuuuuu

我试过了

$ echo "test  test  <br>   test  test" | sed '/ *<br> */s/ /_/g' 
test__test__<br>___test__test
$echo“测试测试
测试测试”| sed'/*
*/s/\ug' 测试测试测试测试
但是我期待着测试测试

我试过@philippe answer

这是可行的,但我提出了另一个空间问题

我试过了

$ echo "for messages:<br>        # This" | perl -pe 's[(\s*<br>\s*)][$v=$1; $v =~ s/ /_/g; "$v"]ge'
for messages:<br>        # This
$echo”用于消息:
#此“| perl-pe的[(\s*
\s*)][$v=$1;$v=~s//\ug;“$v”]ge” 对于消息:
#此
为什么它不起作用

如果我删除了空间,然后手动插入相同的空间,它就会起作用。我不知道那些是什么样的空间

$ echo "for messages:<br>         # This" | perl -pe 's[(\s*<br>\s*)][$v=$1; $v =~ s/ /_/g; "$v"]ge'
for messages:<br>_________# This
$echo”用于消息:
#此“| perl-pe的[(\s*
\s*)][$v=$1;$v=~s//\ug;“$v”]ge” 对于消息:
\uuuuuuuuuuuuuuu35;此
下面两个句子看起来一样,但只有一个有效。你能告诉我什么是神秘的吗。您可以在终端中复制粘贴

"for messages:<br>        # This"  #NOT WORKIN
"for messages:<br>        # This"  #WORKING 
”对于消息:
#此“#不工作 “对于消息:
#此”#正在工作
我复制粘贴在sublime文本编辑器中,以查看它们是什么类型的空格字符

因此,
\s*
\s*
只能处理一种类型的空格

也适用于不起作用的情况

$ echo "for messages:<br>        # This" | od -a
0000000   f   o   r  sp   m   e   s   s   a   g   e   s   :   <   b   r
0000020   >   B  sp  sp   B  sp  sp   B  sp  sp   B  sp  sp   #  sp   T
0000040   h   i   s  nl
$echo”用于消息:
此“| od-a 0000000 f或sp m e s a g e s:B sp B sp B sp#sp T 00000 40小时i s nl
Perl版本:

echo "test  test  <br>   test  test" | perl -CSD -pe 's[\s*<br>\s*][$& =~ s/\s/_/gr]ge'
echo“test test
test test”| perl-CSD-pe的[\s*
\s*][$&=~s/\s/\ugr]ge'
对于不起作用的情况,运行此命令并粘贴结果:

echo "for messages:<br>        # This" | od -a
echo”用于消息:
此“| od-a
我有:

0000000   f   o   r  sp   m   e   s   s   a   g   e   s   :   <   b   r
0000020   >  sp  sp  sp  sp  sp  sp  sp  sp   #  sp   T   h   i   s  nl
0000000或sp m e s a g e s:
sp#sp h i s nl
我用你的有效解决方案更新了我的问题。我面临另一个空间问题。我已经用你问的结果更新了我的问题。不同的是,我发现这是错误的。我将用空格替换,然后使用答案。谢谢你IP:
$v=$1$v=~s/\ug;“$v”
可以写成
$1=~s//\ugr
@santhoshyedii,使用
-CSD
perl-CSD-pe'.
)这将对输入进行解码并对输出进行编码,以便
$
实际包含一个NBSP,以便
\s
与之匹配