how to write a SED script to replace the version c

2020-04-19 09:39发布

问题:

I am taking the version code from user input and trying to replace the existing version code with the new one.

The file which contains version code is named "Version.gradle", it contains

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

I am able to get the version from user, but I don not know how to replace the new version code with exiting one. I am using the below pattern to fetch the existing version code.

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

Current Output:

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

Expected Output:

In version.gradle file, 2 should replace the already existing version code.

回答1:

First, make sure you have write access to the file.

Then, you may use

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

Using FreeBSD sed:

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

POSIX BRE pattern & replacement details

  • \(versionCode[[:space:]]*\) - Capturing group 1:
    • versionCode - a literal word
    • [[:space:]]* - 0 or more whitespaces
  • [0-9]* - 0 or more digits
  • \1 - Group 1 placeholder, it puts back the value captured in Group 1 back into the resulting string
  • ${versionCode} - the versionCode contents (note the double quotes surrounding the command, they enable variable expansion).

See the online sed Linux demo:

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"