Unix - 替换

时间:2009-03-25 18:14:39

标签: regex unix

我有替代问题。我有一个带有1行随机字符的文件,括号“{}”大约1个字符。我想在前一个字符或下一个字符上移动这些括号。 (如果角色线仍然不变,我知道该怎么做。)但我不知道如何在不知道这些字符的情况下这样做,我不知道这些括号在哪里。

例如:“ABC123 {X} CBA321”==> “ABC12 {3} XCBA321”或“ABC123X {C} BA321”

我想使用awk或sed,一些正则表达式,也许......

4 个答案:

答案 0 :(得分:5)

向后移动一个字符:

sed -e 's/\(.\){\(.\)}/{\1}\2/g' file

向前移动一个角色:

sed -e 's/{\(.\)}\(.\)/\1{\2}/g' file

要就地修改文件,请使用-i标志:

sed -i -e 's/\(.\){\(.\)}/{\1}\2/g' file
sed -i -e 's/{\(.\)}\(.\)/\1{\2}/g' file

第一个示例通过匹配任何字符后跟{}包围的字符来工作。没有分组,这是:.{.}我们添加分组,以便我们可以将两个字符放在输出中。而不是用{}围绕第二个字符并围绕第一个字符。这是{\1}\2

第二个示例的工作方式类似,但先匹配{.}.,然后输出\1{\2}

答案 1 :(得分:3)

这会将括号移到上一个字符:

sed -e 's/\(.\){\(.\)}/{\1}\2/g' < in_file > out_file

这会将括号移到下一个字符:

sed -e 's/{\(.\)}\(.\)/\1{\2}/g' < in_file > out_file 

答案 2 :(得分:1)

这是一个小例子。

$ echo "ABC123{X}CBA321" | sed -e 's/\(.\){\(.\)}\(.\)/{\1}\2\3/'
ABC12{3}XCBA321
$ echo "ABC123{X}CBA321" | sed -e 's/\(.\){\(.\)}\(.\)/\1\2{\3}/'
ABC123X{C}BA321

以下是使用sed编辑文件的方法。

$ sed -i -e 's/\(.\){\(.\)}\(.\)/{\1}\2\3/' file
$ sed -i -e 's/\(.\){\(.\)}\(.\)/\1\2{\3}/' file

答案 3 :(得分:0)

我在perl中尝试过。这会将括号移动到前一个字符

my $a="ABC123{X}CBA321";

if ($a =~ /(.)\{(.)\}/)
        {
                print "$`"."{$1}";
                print "$2";
                print "$'";
        }

注意:$`是匹配前的字符串&amp; $'是匹配后的字符串