我想将[]包围的文本字符串交换到此行的末尾。 我的输入字符串:
[xyz] <Rest of line> \n
我想把它换成
<Rest of line> [xyz] \n
特殊角色不喜欢我;-)我试过这个
perl -e s/([.*])(.*)/\2\1/g
答案 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]