【问题标题】:sed: toupper a character on a locationsed:在一个位置上填充一个字符
【发布时间】:2015-07-29 12:10:58
【问题描述】:

这个

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

【问题讨论】:

    标签: sed text-processing uppercase lowercase


    【解决方案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;
    };
    

    【讨论】:

    • 我相信 sed one-liner 应该可以解决我的问题。只有当 sed 方式变得太复杂时,我才不会去 awk。
    【解决方案2】:

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

    编辑:那里的问题/答案使用\L GNU sed 扩展名。 \L开始的转换可以被\E关闭,所以如果你把“你的信”梳理成\2,你可以在它前面加上\L,在它后面紧跟一个\E

    请参阅GNU sed documentation 了解更多信息。

    如果您没有 GNU 扩展,您可以使用两个单独的 sed 命令来执行此操作。您可以使用y 命令将匹配源字符之一的字符更改为相应的目标字符。这类似于 Unix 实用程序 tr

    【讨论】:

    • \L 改变了整个其余部分。 PublicKey 变成 publickey 而不是 publicKey。用这些信息更新问题。 +1
    • 编辑的第一部分很棒。谢谢你。我很遗憾我不能给出更多的分数:-)。第二个不依赖于位置,所以对我不利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多