sed:toupper一个位置的角色

时间:2010-03-09 11:53:02

标签: sed text-processing uppercase lowercase

sed "s/public \(.*\) get\(.*\)()/\1 \2/g"

将转换此

public class ChallengeTO extends AbstractTransferObject {
        public AuthAlgorithm getAlgorithm();
        public long getCode();
        public int getIteration();
        public String getPublicKey();
        public String getSelt();
};

进入这个

public class ChallengeTO extends AbstractTransferObject {
        AuthAlgorithm Algorithm;
        long Code;
        int Iteration;
        String PublicKey;
        String Selt;
};

我想将Algorithm更改为algorithm,将PublicKey更改为publicKey,依此类推。如何将第二段(\2)的第一个字符转换为小写?

更新

sed "s/public \(.*\) get\([A-Z]\)\(.*\)()/\1 \2\3/g"选择“我的信”作为\2,但如果我在其前面放置一个\L则会转换太多(包括\3

2 个答案:

答案 0 :(得分:1)

这是一个awk解决方案

awk '
$1=="public" && $3~/^get/ {
    sub(/^get/,"",$3)
    $3=tolower( substr($3,1,1) ) substr($3,2)
    $0="\t"$2" "$3
}1' file

输出

$ cat file
public class ChallengeTO extends AbstractTransferObject {
        public AuthAlgorithm getAlgorithm();
        public long getCode();
        public int getIteration();
        public String getPublicKey();
        public String getSelt();
};

$ ./shell.sh
public class ChallengeTO extends AbstractTransferObject {
        AuthAlgorithm algorithm();
        long code();
        int iteration();
        String publicKey();
        String selt();
};

如果你仍然喜欢sed,这里是对你的版本的修改,添加了\l

$ sed 's/public \(.*\) get\([A-Z]\)\(.*\)()/\1 \l\2\3/g' file
public class ChallengeTO extends AbstractTransferObject {
        AuthAlgorithm algorithm;
        long code;
        int iteration;
        String publicKey;
        String selt;
};

答案 1 :(得分:1)

这与upper- to lower-case using sed几乎相同。

编辑:那里的问题/答案使用\L GNU sed扩展名。 \L可以关闭由\E开始的转化,因此,如果您将“您的信件”梳理为\2,则可以在\L之前添加\Esed紧随其后{1}}。

有关详细信息,请参阅GNU sed documentation

如果您没有GNU扩展,可以使用两个单独的y命令执行此操作。您可以使用tr命令将与其中一个源角色匹配的角色更改为相应的目标角色。这类似于Unix实用程序{{1}}。