0

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

[xyz] <Rest of line> \n

我想把它换成

<Rest of line> [xyz] \n

特殊字符不喜欢我 ;-) 我试过这个

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

3 回答 3

2

所以你使用了单线

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

这有以下问题:

你没有引用正则表达式。因此,shell 可以将字符 like*解释为 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]
于 2013-09-20T11:08:33.297 回答
1

使用awk

echo "[xyz] <Rest of line>" | awk -F\] '{print $2,$1FS}'
 <Rest of line> [xyz]
于 2013-09-20T11:18:21.110 回答
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]
于 2013-09-20T10:52:08.167 回答