Как написать сценарий SED для замены кода версии, присутствующего в файле, на основе пользовательского ввода с использованием Regex - PullRequest
1 голос
/ 10 апреля 2020

Я беру код версии из пользовательского ввода и пытаюсь заменить существующий код версии новым.

Файл, содержащий код версии, называется "Version.gradle", он содержит

defaultConfig {
    applicationId "com.service_app"
    minSdkVersion rootProject.ext.minSdkVersion
    targetSdkVersion rootProject.ext.targetSdkVersion
    versionCode 1
    versionName "1.0"
}

Я могу получить версию от пользователя, но я не знаю, как заменить код новой версии на выход. Я использую приведенный ниже шаблон для извлечения существующего кода версии.

echo "Enter versionCode"
read versionCode
replacement=$(sed 'versionCode=\"(\\d+)\"' Version.gradle)
replacement=${versionCode}
sed "s/PATTERN/$replacement/g" Version.gradle

Текущий вывод:

command : sed e version.sed
Enter versionCode
2
sed: -e expression #1, char 22: expected newer version of sed
sed: can't read Version.gradle: Permission denied

Ожидаемый вывод:

В файле version.gradle, 2 должен заменить уже существующий код версии.

1 Ответ

0 голосов
/ 10 апреля 2020

Сначала убедитесь, что у вас есть права на запись в файл.

Затем вы можете использовать

sed -i "s/\(versionCode[[:space:]]*\)[0-9]*/\\1${versionCode}/" file

Используя FreeBSD sed:

sed -i '' "s/\(versionCode[[:space:]]*\)[0-9]*/\\1${versionCode}/" file

POSIX BRE схема и детали замены

  • \(versionCode[[:space:]]*\) - Группа захвата 1:
    • versionCode - буквальное слово
    • [[:space:]]* - 0 или более пробелов
  • [0-9]* - 0 или более цифр
  • \1 - заполнитель группы 1, он возвращает значение, полученное в группе 1, обратно в результирующая строка
  • ${versionCode} - содержимое versionCode (обратите внимание на двойные кавычки, окружающие команду, они позволяют расширение переменной).

См. online sed Linux демо :

test=' defaultConfig {
    applicationId "com.service_app"
    minSdkVersion rootProject.ext.minSdkVersion
    targetSdkVersion rootProject.ext.targetSdkVersion
    versionCode 1
    versionName "1.0"
}'
echo "Enter versionCode"
read versionCode
echo "$versionCode"
sed "s/\(versionCode[[:space:]]*\)[0-9]*/\1${versionCode}/" <<< "$test"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...