sed: тапнуть персонажа в локации - PullRequest
1 голос
/ 09 марта 2010

Это

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) в нижний регистр?

UPDATE

sed "s/public \(.*\) get\([A-Z]\)\(.*\)()/\1 \2\3/g" выбирает "мое письмо" как \2, но если я поставлю \L перед ним, оно преобразуется слишком сильно (включая \3)

Ответы [ 2 ]

1 голос
/ 09 марта 2010

Это почти идентично в верхнем и нижнем регистре с использованием sed .

РЕДАКТИРОВАТЬ: вопрос / ответ там использует расширение \L GNU sed. Преобразование, начатое \L, может быть отключено \E, поэтому, если вы дразните "ваше письмо" в \2, вы можете поставить \L перед ним и \E сразу после него. *

См. Документацию GNU sed для получения дополнительной информации.

Если у вас нет расширений GNU, вы можете сделать это с помощью двух отдельных команд sed. Вы можете использовать команду y, чтобы изменить символ, который соответствует одному из исходного символа, в соответствующий целевой символ. Это похоже на утилиту Unix tr.

1 голос
/ 09 марта 2010

вот решение 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;
};
...