交换包含sed或perl -e特殊字符的文本字符串

时间:2013-09-20 10:40:48

标签: perl shell sed

我想将[]包围的文本字符串交换到此行的末尾。 我的输入字符串:

[xyz] <Rest of line> \n

我想把它换成

<Rest of line> [xyz] \n

特殊角色不喜欢我;-)我试过这个

perl -e s/([.*])(.*)/\2\1/g 

3 个答案:

答案 0 :(得分:2)

所以你使用了单行

 perl -e s/([.*])(.*)/\2\1/g

这有以下问题:

你没有引用正则表达式。因此,像*这样的字符可以被shell解释为glob。使用单引号:

perl -e 's/([.*])(.*)/\2\1/g'

现在,在正则表达式中,[]是特殊的:它们包含字符类。 charclass [.*]表示:匹配文字.*。要使括号非特殊,请将它们转义。

perl -e 's/(\[.*\])(.*)/\2\1/g'

现在这个正则表达式意味着匹配一个左括号,匹配尽可能多的字符,然后是一个结束括号。在那之后,尽可能多的角色。这最终会匹配到第一组中的最后一个]。例如。输入[foo][bar]baz将为baz[foo][bar]

我们将更改正则表达式,因此它意味着:“匹配一个左括号,然后尽可能多的非结束括号字符,然后是一个结束括号。 ...”:

perl -e 's/(\[[^\]]*\])(.*)/\2\1/g'

接下来的问题是你没有给perl任何东西来匹配。如果要将此正则表达式应用于输入中的每一行,请添加-p选项。现在:

perl -pe's/(\[[^\]]*\])(.*)/\2\1/g'

现在只剩下一些小问题了。输入

abc def
[abc] def

输出

abc def
 def[abc]

我们可以为部件之间的空白添加另一个捕获。我们还应该在替换部分中使用变量$1等。 /g选项在这里没用。现在我们得到:

perl -pe's/^(\[[^\]]*\])(\s*)(.*)/$3$2$1/'

哪个输出:

abc def
def [abc]

答案 1 :(得分:1)

使用awk

echo "[xyz] <Rest of line>" | awk -F\] '{print $2,$1FS}'
 <Rest of line> [xyz]

答案 2 :(得分:0)

#!/usr/bin/perl
use warnings;
use strict;

my $string = ("[xyz] <Rest of line> \n");
my ($match1, $match2) = ($string =~ /(\[\w+\])(.*)/);
print "$match2 $match1\n";

输出:

<Rest of line>  [xyz]