diff --git a/lib/datasource/crate/index.ts b/lib/datasource/crate/index.ts
index 5f1536f5987c55c54dbc31a38a20598262655db5..42d8a328b6a8e5a45f02bf2a508b346baf89166b 100644
--- a/lib/datasource/crate/index.ts
+++ b/lib/datasource/crate/index.ts
@@ -7,7 +7,7 @@ import * as memCache from '../../util/cache/memory';
 import { cache } from '../../util/cache/package/decorator';
 import { privateCacheDir, readFile } from '../../util/fs';
 import { simpleGitConfig } from '../../util/git/config';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import * as cargoVersioning from '../../versioning/cargo';
 import { Datasource } from '../datasource';
 import type { GetReleasesConfig, Release, ReleaseResult } from '../types';
@@ -65,7 +65,7 @@ export class CrateDatasource extends Datasource {
       lookupName
     );
     const lines = payload
-      .split('\n') // break into lines
+      .split(newlineRegex) // break into lines
       .map((line) => line.trim()) // remove whitespace
       .filter((line) => line.length !== 0) // remove empty lines
       .map((line) => JSON.parse(line) as CrateRecord); // parse
diff --git a/lib/datasource/git-refs/base.ts b/lib/datasource/git-refs/base.ts
index 5cc5548a173fc453c2f25430160544a792cc7776..93c11ab29570168a9ff75d8f7534d6bd847cae91 100644
--- a/lib/datasource/git-refs/base.ts
+++ b/lib/datasource/git-refs/base.ts
@@ -3,7 +3,7 @@ import { logger } from '../../logger';
 import { cache } from '../../util/cache/package/decorator';
 import { simpleGitConfig } from '../../util/git/config';
 import { getRemoteUrlWithToken } from '../../util/git/url';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { GetReleasesConfig } from '../types';
 import type { RawRefs } from './types';
 
@@ -34,7 +34,7 @@ export class GitDatasource {
 
     const refs = lsRemote
       .trim()
-      .split('\n')
+      .split(newlineRegex)
       .map((line) => line.trim())
       .map((line) => {
         let match = refMatch.exec(line);
diff --git a/lib/datasource/github-releases/digest.ts b/lib/datasource/github-releases/digest.ts
index 3401f8507c420c355ed13445234384360eb6bbc4..56861fe0b7fe231324732c464457438b0d6dab0a 100644
--- a/lib/datasource/github-releases/digest.ts
+++ b/lib/datasource/github-releases/digest.ts
@@ -1,6 +1,6 @@
 import hasha from 'hasha';
 import * as packageCache from '../../util/cache/package';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { cacheNamespace, http } from './common';
 import type { DigestAsset, GithubRelease, GithubReleaseAsset } from './types';
 
@@ -13,7 +13,7 @@ async function findDigestFile(
   );
   for (const asset of smallAssets) {
     const res = await http.get(asset.browser_download_url);
-    for (const line of res.body.split('\n')) {
+    for (const line of res.body.split(newlineRegex)) {
       const [lineDigest, lineFn] = line.split(regEx(/\s+/), 2);
       if (lineDigest === digest) {
         return {
@@ -127,7 +127,7 @@ export async function mapDigestAssetToRelease(
   if (digestAsset.digestedFileName) {
     const releaseFilename = digestAsset.digestedFileName.replace(current, next);
     const res = await http.get(releaseAsset.browser_download_url);
-    for (const line of res.body.split('\n')) {
+    for (const line of res.body.split(newlineRegex)) {
       const [lineDigest, lineFn] = line.split(regEx(/\s+/), 2);
       if (lineFn === releaseFilename) {
         return lineDigest;
diff --git a/lib/datasource/maven/index.ts b/lib/datasource/maven/index.ts
index 7ad19360fc2e787d473ff54dc7a3ded74c44a9f3..603e842395a2452d24f9eb72ba597fd8511c29fa 100644
--- a/lib/datasource/maven/index.ts
+++ b/lib/datasource/maven/index.ts
@@ -4,7 +4,7 @@ import pAll from 'p-all';
 import { XmlDocument } from 'xmldoc';
 import { logger } from '../../logger';
 import * as packageCache from '../../util/cache/package';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { ensureTrailingSlash } from '../../util/url';
 import mavenVersion from '../../versioning/maven';
 import * as mavenVersioning from '../../versioning/maven';
@@ -110,7 +110,7 @@ async function addReleasesFromIndexPage(
         const indexUrl = getMavenUrl(dependency, repoUrl, 'index.html');
         const res = await downloadHttpProtocol(indexUrl);
         const { body = '' } = res;
-        for (const line of body.split('\n')) {
+        for (const line of body.split(newlineRegex)) {
           const match = line.trim().match(mavenCentralHtmlVersionRegex);
           if (match) {
             const { version, releaseTimestamp: timestamp } =
diff --git a/lib/datasource/pod/index.ts b/lib/datasource/pod/index.ts
index f79dac3c10d9a341aedbe2d5abd2f781a45b3699..61fcd4b5deada0ec50fee8efd2f184a20c8f8909 100644
--- a/lib/datasource/pod/index.ts
+++ b/lib/datasource/pod/index.ts
@@ -6,7 +6,7 @@ import * as packageCache from '../../util/cache/package';
 import { Http } from '../../util/http';
 import { GithubHttp } from '../../util/http/github';
 import type { HttpError } from '../../util/http/types';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { massageGithubUrl } from '../metadata';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
@@ -179,7 +179,7 @@ async function getReleasesFromCDN(
   const url = releasesCDNUrl(lookupName, registryUrl);
   const resp = await requestCDN(url, lookupName);
   if (resp) {
-    const lines = resp.split('\n');
+    const lines = resp.split(newlineRegex);
     for (let idx = 0; idx < lines.length; idx += 1) {
       const line = lines[idx];
       const [name, ...versions] = line.split('/');
diff --git a/lib/datasource/rubygems/get-rubygems-org.ts b/lib/datasource/rubygems/get-rubygems-org.ts
index 3be067768bda5c8ce004bf3a2adafeb57243fc0b..ef61c47e1f9e69c0b32ac25de4b2eb7abcf4202c 100644
--- a/lib/datasource/rubygems/get-rubygems-org.ts
+++ b/lib/datasource/rubygems/get-rubygems-org.ts
@@ -1,6 +1,7 @@
 import { logger } from '../../logger';
 import { ExternalHostError } from '../../types/errors/external-host-error';
 import { getElapsedMinutes } from '../../util/date';
+import { newlineRegex } from '../../util/regex';
 import { Datasource } from '../datasource';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
@@ -71,7 +72,7 @@ export class RubyGemsOrgDatasource extends Datasource {
       return;
     }
 
-    for (const line of newLines.split('\n')) {
+    for (const line of newLines.split(newlineRegex)) {
       RubyGemsOrgDatasource.processLine(line);
     }
     lastSync = new Date();
diff --git a/lib/manager/ansible-galaxy/extract.ts b/lib/manager/ansible-galaxy/extract.ts
index 8ce428608f72bae3fe67d11e230cbd50209641ae..ab15de0ab32f7a69da93216540984f5a212e203a 100644
--- a/lib/manager/ansible-galaxy/extract.ts
+++ b/lib/manager/ansible-galaxy/extract.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { PackageDependency, PackageFile } from '../types';
 import { extractCollections } from './collections';
 import { extractCollectionsMetaDataFile } from './collections-metadata';
@@ -29,7 +29,7 @@ export function extractPackageFile(
   logger.trace('ansible-galaxy.extractPackageFile()');
   const galaxyFileNameRegEx = regEx(/galaxy\.ya?ml$/);
   const deps: PackageDependency[] = [];
-  const lines = content.split('\n');
+  const lines = content.split(newlineRegex);
 
   try {
     // if this is a galaxy.yml file we have to interpret the dependencies differently
diff --git a/lib/manager/ansible/extract.ts b/lib/manager/ansible/extract.ts
index 740921fbc6bcf912d70e973bfa77c525071735ea..6b31713014ed72e9c89668d629c914be70ca6739 100644
--- a/lib/manager/ansible/extract.ts
+++ b/lib/manager/ansible/extract.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import * as dockerVersioning from '../../versioning/docker';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFile } from '../types';
@@ -8,7 +8,7 @@ export function extractPackageFile(content: string): PackageFile | null {
   logger.trace('ansible.extractPackageFile()');
   let deps: PackageDependency[] = [];
   const re = regEx(/^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/);
-  for (const line of content.split('\n')) {
+  for (const line of content.split(newlineRegex)) {
     const match = re.exec(line);
     if (match) {
       const currentFrom = match[1];
diff --git a/lib/manager/bitbucket-pipelines/extract.ts b/lib/manager/bitbucket-pipelines/extract.ts
index cdefc542d7626cf0bddeb303e6bf338e870debac..54ab9df365408ec1b01a82e33ec98580d3593553 100644
--- a/lib/manager/bitbucket-pipelines/extract.ts
+++ b/lib/manager/bitbucket-pipelines/extract.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFile } from '../types';
 
@@ -10,7 +10,7 @@ export function extractPackageFile(content: string): PackageFile | null {
   const deps: PackageDependency[] = [];
 
   try {
-    const lines = content.split('\n');
+    const lines = content.split(newlineRegex);
     for (const line of lines) {
       const pipeMatch = pipeRegex.exec(line);
       if (pipeMatch) {
diff --git a/lib/manager/buildkite/extract.ts b/lib/manager/buildkite/extract.ts
index 818896b0fa2f6b3b5dd194409e7acff64cdd233c..aa7ac03974db3d176b5d14d65b381d1652217e7a 100644
--- a/lib/manager/buildkite/extract.ts
+++ b/lib/manager/buildkite/extract.ts
@@ -1,14 +1,14 @@
 import * as datasourceGithubTags from '../../datasource/github-tags';
 import { logger } from '../../logger';
 import { SkipReason } from '../../types';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { isVersion } from '../../versioning/semver';
 import type { PackageDependency, PackageFile } from '../types';
 
 export function extractPackageFile(content: string): PackageFile | null {
   const deps: PackageDependency[] = [];
   try {
-    const lines = content.split('\n');
+    const lines = content.split(newlineRegex);
     let isPluginsSection = false;
     let pluginsIndent = '';
     for (let lineNumber = 1; lineNumber <= lines.length; lineNumber += 1) {
diff --git a/lib/manager/bundler/extract.ts b/lib/manager/bundler/extract.ts
index 22a676d6b76f19b547af2f1d26e9b47a233d3b20..7ea1c07f9e9963ed6e8405aed45735087452362e 100644
--- a/lib/manager/bundler/extract.ts
+++ b/lib/manager/bundler/extract.ts
@@ -1,7 +1,7 @@
 import { RubyGemsDatasource } from '../../datasource/rubygems';
 import { logger } from '../../logger';
 import { readLocalFile } from '../../util/fs';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { PackageDependency, PackageFile } from '../types';
 import { extractLockFileEntries } from './locked-version';
 
@@ -17,7 +17,7 @@ export async function extractPackageFile(
     registryUrls: [],
     deps: [],
   };
-  const lines = content.split('\n');
+  const lines = content.split(newlineRegex);
   const delimiters = ['"', "'"];
   for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
     const line = lines[lineNumber];
diff --git a/lib/manager/bundler/locked-version.ts b/lib/manager/bundler/locked-version.ts
index e2d786c9e0b966b4ac75ef47a2d5045aa2a8078a..544e3f344a9f55851b5c89a17b8bcdb90f3f8d96 100644
--- a/lib/manager/bundler/locked-version.ts
+++ b/lib/manager/bundler/locked-version.ts
@@ -1,4 +1,5 @@
 import { logger } from '../../logger';
+import { newlineRegex } from '../../util/regex';
 import { isVersion } from '../../versioning/ruby';
 
 const DEP_REGEX = new RegExp('(?<=\\().*(?=\\))'); // TODO #12872  (?<=re)	after text matching
@@ -8,7 +9,7 @@ export function extractLockFileEntries(
   const gemLock = new Map<string, string>();
   try {
     let parsingGemSection = false;
-    lockFileContent.split('\n').forEach((eachLine) => {
+    lockFileContent.split(newlineRegex).forEach((eachLine) => {
       const whitespace = eachLine.indexOf(eachLine.trim());
       const isGemLine = eachLine.trim().startsWith('GEM');
       if (parsingGemSection === false && whitespace === 0 && isGemLine) {
diff --git a/lib/manager/circleci/extract.ts b/lib/manager/circleci/extract.ts
index 8f44a985015221a826d613bca591f6bcab5439dd..5e3ecd60ac14d4df9b63b49ddafd02f0789bdb69 100644
--- a/lib/manager/circleci/extract.ts
+++ b/lib/manager/circleci/extract.ts
@@ -1,6 +1,6 @@
 import { OrbDatasource } from '../../datasource/orb';
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import * as npmVersioning from '../../versioning/npm';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFile } from '../types';
@@ -8,7 +8,7 @@ import type { PackageDependency, PackageFile } from '../types';
 export function extractPackageFile(content: string): PackageFile | null {
   const deps: PackageDependency[] = [];
   try {
-    const lines = content.split('\n');
+    const lines = content.split(newlineRegex);
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
       const line = lines[lineNumber];
       const orbs = regEx(/^\s*orbs:\s*$/).exec(line);
diff --git a/lib/manager/cocoapods/artifacts.ts b/lib/manager/cocoapods/artifacts.ts
index 4c30ad6be5a9fc11dfbc01b6848499e19670f568..c32d50c9290f81b1d3ef6f1b21ff8840d887102d 100644
--- a/lib/manager/cocoapods/artifacts.ts
+++ b/lib/manager/cocoapods/artifacts.ts
@@ -11,14 +11,14 @@ import {
   writeLocalFile,
 } from '../../util/fs';
 import { getRepoStatus } from '../../util/git';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { UpdateArtifact, UpdateArtifactsResult } from '../types';
 
 const pluginRegex = regEx(`^\\s*plugin\\s*(['"])(?<plugin>[^'"]+)(['"])`);
 
 function getPluginCommands(content: string): string[] {
   const result = new Set<string>();
-  const lines: string[] = content.split('\n');
+  const lines: string[] = content.split(newlineRegex);
   lines.forEach((line) => {
     const match = pluginRegex.exec(line);
     if (match) {
diff --git a/lib/manager/cocoapods/extract.ts b/lib/manager/cocoapods/extract.ts
index 6f6fe1bcf136b43b55aaf36767093232816ec4ab..5c4ad4d668d8a9f0c1bea1600076e90d6583a8fd 100644
--- a/lib/manager/cocoapods/extract.ts
+++ b/lib/manager/cocoapods/extract.ts
@@ -4,7 +4,7 @@ import * as datasourceGitlabTags from '../../datasource/gitlab-tags';
 import * as datasourcePod from '../../datasource/pod';
 import { logger } from '../../logger';
 import { getSiblingFileName, localPathExists } from '../../util/fs';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { PackageDependency, PackageFile } from '../types';
 import type { ParsedLine } from './types';
 
@@ -86,7 +86,7 @@ export async function extractPackageFile(
 ): Promise<PackageFile | null> {
   logger.trace('cocoapods.extractPackageFile()');
   const deps: PackageDependency[] = [];
-  const lines: string[] = content.split('\n');
+  const lines: string[] = content.split(newlineRegex);
 
   const registryUrls: string[] = [];
 
diff --git a/lib/manager/docker-compose/extract.ts b/lib/manager/docker-compose/extract.ts
index ce5e937300b317a157ca90c4f1865fccd7634b0e..3c17196a9629f2b329d784b53c1e235bbf3e0273 100644
--- a/lib/manager/docker-compose/extract.ts
+++ b/lib/manager/docker-compose/extract.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
 import { load } from 'js-yaml';
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { getDep } from '../dockerfile/extract';
 import type { PackageFile } from '../types';
 import type { DockerComposeConfig } from './types';
@@ -10,7 +10,7 @@ class LineMapper {
   private imageLines: { line: string; lineNumber: number; used: boolean }[];
 
   constructor(content: string, filter: RegExp) {
-    this.imageLines = [...content.split('\n').entries()]
+    this.imageLines = [...content.split(newlineRegex).entries()]
       .filter((entry) => filter.test(entry[1]))
       .map(([lineNumber, line]) => ({ lineNumber, line, used: false }));
   }
diff --git a/lib/manager/droneci/extract.ts b/lib/manager/droneci/extract.ts
index 6dc15f47d47db6c81f4a2896d9394000c5272475..da8a1d26f2124b95b51514130a63125bb26d7577 100644
--- a/lib/manager/droneci/extract.ts
+++ b/lib/manager/droneci/extract.ts
@@ -1,12 +1,12 @@
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFile } from '../types';
 
 export function extractPackageFile(content: string): PackageFile | null {
   const deps: PackageDependency[] = [];
   try {
-    const lines = content.split('\n');
+    const lines = content.split(newlineRegex);
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
       const line = lines[lineNumber];
       const match = regEx(/^\s* image:\s*'?"?([^\s'"]+)'?"?\s*$/).exec(line);
diff --git a/lib/manager/github-actions/extract.ts b/lib/manager/github-actions/extract.ts
index af05c0505e8872d54162acf14b7af15406f3b9a1..b22b96436d1cef860072c51cd0c7a8bbd310caad 100644
--- a/lib/manager/github-actions/extract.ts
+++ b/lib/manager/github-actions/extract.ts
@@ -1,6 +1,6 @@
 import * as githubTagsDatasource from '../../datasource/github-tags';
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import * as dockerVersioning from '../../versioning/docker';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFile } from '../types';
@@ -16,7 +16,7 @@ const shaRe = regEx(/^[a-z0-9]{40}|[a-z0-9]{64}$/);
 export function extractPackageFile(content: string): PackageFile | null {
   logger.trace('github-actions.extractPackageFile()');
   const deps: PackageDependency[] = [];
-  for (const line of content.split('\n')) {
+  for (const line of content.split(newlineRegex)) {
     if (line.trim().startsWith('#')) {
       continue;
     }
diff --git a/lib/manager/gitlabci/extract.ts b/lib/manager/gitlabci/extract.ts
index af6b4e2026cd2e2d42fea4bcbfade7c204730a83..b5baca0e3005eca4b8d8d9b254eb73ec9267bd75 100644
--- a/lib/manager/gitlabci/extract.ts
+++ b/lib/manager/gitlabci/extract.ts
@@ -2,7 +2,7 @@ import is from '@sindresorhus/is';
 import { load } from 'js-yaml';
 import { logger } from '../../logger';
 import { readLocalFile } from '../../util/fs';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { getDep } from '../dockerfile/extract';
 import type { ExtractConfig, PackageDependency, PackageFile } from '../types';
 import type { GitlabPipeline } from './types';
@@ -35,7 +35,7 @@ function skipCommentAndAliasLines(
 export function extractPackageFile(content: string): PackageFile | null {
   const deps: PackageDependency[] = [];
   try {
-    const lines = content.split('\n');
+    const lines = content.split(newlineRegex);
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
       const line = lines[lineNumber];
       const imageMatch = imageRe.exec(line);
diff --git a/lib/manager/gomod/extract.ts b/lib/manager/gomod/extract.ts
index db7733d1817ef7b6fd3dc1f5775b9ca33eed98a1..2bfa914d52ebee78702324741c630b4da2d609b6 100644
--- a/lib/manager/gomod/extract.ts
+++ b/lib/manager/gomod/extract.ts
@@ -1,7 +1,7 @@
 import semver from 'semver';
 import { GoDatasource } from '../../datasource/go';
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { isVersion } from '../../versioning/semver';
 import type { PackageDependency, PackageFile } from '../types';
 
@@ -39,7 +39,7 @@ export function extractPackageFile(content: string): PackageFile | null {
   const constraints: Record<string, any> = {};
   const deps: PackageDependency[] = [];
   try {
-    const lines = content.split('\n');
+    const lines = content.split(newlineRegex);
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
       let line = lines[lineNumber];
       if (
diff --git a/lib/manager/gomod/update.ts b/lib/manager/gomod/update.ts
index 91b8f0dce6ba15558f8981069876f0301ee7c843..91a09d684aa8970ae11dbccdfc22d6746b2e3448 100644
--- a/lib/manager/gomod/update.ts
+++ b/lib/manager/gomod/update.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { UpdateDependencyConfig } from '../types';
 
 function getDepNameWithNoVersion(depName: string): string {
@@ -22,7 +22,7 @@ export function updateDependency({
       return null;
     }
     const depNameNoVersion = getDepNameWithNoVersion(depName);
-    const lines = fileContent.split('\n');
+    const lines = fileContent.split(newlineRegex);
     const lineToChange = lines[upgrade.managerData.lineNumber];
     if (
       !lineToChange.includes(depNameNoVersion) &&
diff --git a/lib/manager/gradle-wrapper/artifacts.ts b/lib/manager/gradle-wrapper/artifacts.ts
index 10d0500c00b6816b17088441ff044cd7bc2eaf82..59c8bc56c8edf58a296070904aefbcfb1971dfcb 100644
--- a/lib/manager/gradle-wrapper/artifacts.ts
+++ b/lib/manager/gradle-wrapper/artifacts.ts
@@ -9,6 +9,7 @@ import { readLocalFile, stat, writeLocalFile } from '../../util/fs';
 import { getRepoStatus } from '../../util/git';
 import type { StatusResult } from '../../util/git/types';
 import { Http } from '../../util/http';
+import { newlineRegex } from '../../util/regex';
 import type { UpdateArtifact, UpdateArtifactsResult } from '../types';
 import {
   extraEnv,
@@ -38,7 +39,7 @@ async function addIfUpdated(
 
 function getDistributionUrl(newPackageFileContent: string): string {
   const distributionUrlLine = newPackageFileContent
-    .split('\n')
+    .split(newlineRegex)
     .find((line) => line.startsWith('distributionUrl='));
   if (distributionUrlLine) {
     return distributionUrlLine
diff --git a/lib/manager/gradle-wrapper/utils.ts b/lib/manager/gradle-wrapper/utils.ts
index 99f389ed196f0a621e518aae774bc9f35d46d341..bb72b2b01542ac4e9abd2eee65b39509f51212ac 100644
--- a/lib/manager/gradle-wrapper/utils.ts
+++ b/lib/manager/gradle-wrapper/utils.ts
@@ -4,7 +4,7 @@ import upath from 'upath';
 import { GlobalConfig } from '../../config/global';
 import { logger } from '../../logger';
 import { chmod } from '../../util/fs';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import gradleVersioning from '../../versioning/gradle';
 import { id as npmVersioning } from '../../versioning/npm';
 import { GradleVersionExtract } from './types';
@@ -81,7 +81,7 @@ const DISTRIBUTION_URL_REGEX = regEx(
 export function extractGradleVersion(
   fileContent: string
 ): GradleVersionExtract | null {
-  const lines = fileContent?.split('\n') ?? [];
+  const lines = fileContent?.split(newlineRegex) ?? [];
 
   for (const line of lines) {
     const distributionUrlMatch = DISTRIBUTION_URL_REGEX.exec(line);
diff --git a/lib/manager/gradle/shallow/parser.ts b/lib/manager/gradle/shallow/parser.ts
index 6392a898c4ef450ba421aba8ecf025e59e19c0ed..922352b87c8575fea3450177171fc774045fd13b 100644
--- a/lib/manager/gradle/shallow/parser.ts
+++ b/lib/manager/gradle/shallow/parser.ts
@@ -1,7 +1,7 @@
 import url from 'url';
 import is from '@sindresorhus/is';
 import { logger } from '../../../logger';
-import { regEx } from '../../../util/regex';
+import { newlineRegex, regEx } from '../../../util/regex';
 import type { PackageDependency } from '../../types';
 import type { GradleManagerData } from '../types';
 import {
@@ -694,7 +694,7 @@ export function parseProps(
   let offset = 0;
   const vars = {};
   const deps = [];
-  for (const line of input.split('\n')) {
+  for (const line of input.split(newlineRegex)) {
     const lineMatch = propRegex.exec(line);
     if (lineMatch) {
       const { key, value, leftPart } = lineMatch.groups;
diff --git a/lib/manager/jenkins/extract.ts b/lib/manager/jenkins/extract.ts
index f19f42cfc61efd4ee85ab41f75913fae3777317c..86e94a74b4ef4288f3e17ad8131b9516cbebbe6a 100644
--- a/lib/manager/jenkins/extract.ts
+++ b/lib/manager/jenkins/extract.ts
@@ -3,7 +3,7 @@ import { load } from 'js-yaml';
 import { JenkinsPluginsDatasource } from '../../datasource/jenkins-plugins';
 import { logger } from '../../logger';
 import { isSkipComment } from '../../util/ignore';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import * as dockerVersioning from '../../versioning/docker';
 import type { PackageDependency, PackageFile } from '../types';
 import type { JenkinsPlugin, JenkinsPlugins } from './types';
@@ -75,7 +75,7 @@ function extractText(content: string): PackageDependency[] {
     /^\s*(?<depName>[\d\w-]+):(?<currentValue>[^#\s]+)[#\s]*(?<comment>.*)$/
   );
 
-  for (const line of content.split('\n')) {
+  for (const line of content.split(newlineRegex)) {
     const match = regex.exec(line);
     if (match) {
       const { depName, currentValue, comment } = match.groups;
diff --git a/lib/manager/kubernetes/extract.ts b/lib/manager/kubernetes/extract.ts
index f537f5dadea5f7f8af654df3e075a616356c4b51..a3f18948fc17ca5a5b782df2de5c01777686c367 100644
--- a/lib/manager/kubernetes/extract.ts
+++ b/lib/manager/kubernetes/extract.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFile } from '../types';
 
@@ -14,7 +14,7 @@ export function extractPackageFile(content: string): PackageFile | null {
     return null;
   }
 
-  for (const line of content.split('\n')) {
+  for (const line of content.split(newlineRegex)) {
     const match = regEx(/^\s*-?\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/).exec(line);
     if (match) {
       const currentFrom = match[1];
diff --git a/lib/manager/leiningen/extract.ts b/lib/manager/leiningen/extract.ts
index 9d83ff1022c7ee37571e4c1af23a3721fa1c119e..285b8f6b7e3fe7b4aa207245fb46c78db502c9fc 100644
--- a/lib/manager/leiningen/extract.ts
+++ b/lib/manager/leiningen/extract.ts
@@ -1,5 +1,5 @@
 import { ClojureDatasource } from '../../datasource/clojure';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { PackageDependency, PackageFile } from '../types';
 import type { ExtractContext, ExtractedVariables } from './types';
 
@@ -142,7 +142,7 @@ const defRegex = regEx(
 
 export function extractVariables(content: string): ExtractedVariables {
   const result: ExtractedVariables = {};
-  const lines = content.split('\n');
+  const lines = content.split(newlineRegex);
   for (let idx = 0; idx < lines.length; idx += 1) {
     const line = lines[idx];
     const match = defRegex.exec(line);
diff --git a/lib/manager/mix/extract.ts b/lib/manager/mix/extract.ts
index bdbe0f1496868ce4d65cf6c002cee689e767a719..d363e864bf67c0c2bc3a7a76850698ba6942f148 100644
--- a/lib/manager/mix/extract.ts
+++ b/lib/manager/mix/extract.ts
@@ -1,7 +1,7 @@
 import { HexDatasource } from '../../datasource/hex';
 import { logger } from '../../logger';
 import { findLocalSiblingOrParent, localPathExists } from '../../util/fs';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { PackageDependency, PackageFile } from '../types';
 
 const depSectionRegExp = regEx(/defp\s+deps.*do/g);
@@ -15,7 +15,7 @@ export async function extractPackageFile(
 ): Promise<PackageFile | null> {
   logger.trace('mix.extractPackageFile()');
   const deps: PackageDependency[] = [];
-  const contentArr = content.split('\n');
+  const contentArr = content.split(newlineRegex);
 
   for (let lineNumber = 0; lineNumber < contentArr.length; lineNumber += 1) {
     if (contentArr[lineNumber].match(depSectionRegExp)) {
diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts
index 4ed414e8277556b252efc2739ac07e4d67f0bf3c..6ee99165f10e23d0b10bace0e2cef24160d5754b 100644
--- a/lib/manager/npm/extract/index.ts
+++ b/lib/manager/npm/extract/index.ts
@@ -6,7 +6,7 @@ import * as datasourceGithubTags from '../../../datasource/github-tags';
 import { id as npmId } from '../../../datasource/npm';
 import { logger } from '../../../logger';
 import { getSiblingFileName, readLocalFile } from '../../../util/fs';
-import { regEx } from '../../../util/regex';
+import { newlineRegex, regEx } from '../../../util/regex';
 import * as nodeVersioning from '../../../versioning/node';
 import { isValid, isVersion } from '../../../versioning/npm';
 import type {
@@ -124,7 +124,7 @@ export async function extractPackageFile(
           'Stripping .npmrc file of lines with variables'
         );
         repoNpmrc = repoNpmrc
-          .split('\n')
+          .split(newlineRegex)
           .filter((line) => !line.includes('=${'))
           .join('\n');
       }
diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts
index ae6f8588da106a5e7ac725d4e7b69f29f895db3b..9f19c6e144f9092ab7be70d1502daf8aa1ac66d0 100644
--- a/lib/manager/npm/post-update/index.ts
+++ b/lib/manager/npm/post-update/index.ts
@@ -25,7 +25,7 @@ import {
 import { branchExists, getFile, getRepoStatus } from '../../../util/git';
 import type { FileChange } from '../../../util/git/types';
 import * as hostRules from '../../../util/host-rules';
-import { regEx } from '../../../util/regex';
+import { newlineRegex, regEx } from '../../../util/regex';
 import { ensureTrailingSlash } from '../../../util/url';
 import type { PackageFile, PostUpdateConfig, Upgrade } from '../../types';
 import { getZeroInstallPaths } from '../extract/yarn';
@@ -377,7 +377,7 @@ async function updateYarnOffline(
     } else if (yarnrc) {
       // Yarn 1 (offline mirror)
       const mirrorLine = yarnrc
-        .split('\n')
+        .split(newlineRegex)
         .find((line) => line.startsWith('yarn-offline-mirror '));
       if (mirrorLine) {
         const mirrorPath = ensureTrailingSlash(
diff --git a/lib/manager/npm/post-update/node-version.ts b/lib/manager/npm/post-update/node-version.ts
index 67e8227612843f0b7c35fd8542669a2a2d22ab20..2bd245e087d230c536b7aff313d7a390566dcfc6 100644
--- a/lib/manager/npm/post-update/node-version.ts
+++ b/lib/manager/npm/post-update/node-version.ts
@@ -1,13 +1,13 @@
 import semver from 'semver';
 import { logger } from '../../../logger';
 import { getSiblingFileName, readLocalFile } from '../../../util/fs';
-import { regEx } from '../../../util/regex';
+import { newlineRegex, regEx } from '../../../util/regex';
 import type { PostUpdateConfig } from '../../types';
 
 async function getNodeFile(filename: string): Promise<string> | null {
   try {
     const constraint = (await readLocalFile(filename, 'utf8'))
-      .split('\n')[0]
+      .split(newlineRegex)[0]
       .replace(regEx(/^v/), '');
     if (semver.validRange(constraint)) {
       logger.debug(`Using node constraint "${constraint}" from ${filename}`);
diff --git a/lib/manager/npm/post-update/yarn.ts b/lib/manager/npm/post-update/yarn.ts
index 99aadaea2966d91379ab0df99b87ea560388f8c5..576530236ab8c22b9dc56f79c363adbc1cf43b45 100644
--- a/lib/manager/npm/post-update/yarn.ts
+++ b/lib/manager/npm/post-update/yarn.ts
@@ -13,7 +13,7 @@ import { ExternalHostError } from '../../../types/errors/external-host-error';
 import { exec } from '../../../util/exec';
 import type { ExecOptions } from '../../../util/exec/types';
 import { exists, readFile, remove, writeFile } from '../../../util/fs';
-import { regEx } from '../../../util/regex';
+import { newlineRegex, regEx } from '../../../util/regex';
 import type { PostUpdateConfig, Upgrade } from '../../types';
 import { getNodeConstraint } from './node-version';
 import { GenerateLockFileResult } from './types';
@@ -27,11 +27,11 @@ export async function checkYarnrc(
     const yarnrc = await readFile(`${cwd}/.yarnrc`, 'utf8');
     if (is.string(yarnrc)) {
       const mirrorLine = yarnrc
-        .split('\n')
+        .split(newlineRegex)
         .find((line) => line.startsWith('yarn-offline-mirror '));
       offlineMirror = !!mirrorLine;
       const pathLine = yarnrc
-        .split('\n')
+        .split(newlineRegex)
         .find((line) => line.startsWith('yarn-path '));
       if (pathLine) {
         yarnPath = pathLine.replace(regEx(/^yarn-path\s+"?(.+?)"?$/), '$1');
diff --git a/lib/manager/pip_requirements/artifacts.ts b/lib/manager/pip_requirements/artifacts.ts
index e7f59f507ea0651e867c3da89a7c7efff98abbbb..3eb65900baf42df5607e2fa29f8c315bef77c324 100644
--- a/lib/manager/pip_requirements/artifacts.ts
+++ b/lib/manager/pip_requirements/artifacts.ts
@@ -4,7 +4,7 @@ import { logger } from '../../logger';
 import { exec } from '../../util/exec';
 import type { ExecOptions } from '../../util/exec/types';
 import { readLocalFile } from '../../util/fs';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { UpdateArtifact, UpdateArtifactsResult } from '../types';
 
 export async function updateArtifacts({
@@ -21,7 +21,9 @@ export async function updateArtifacts({
   try {
     const cmd: string[] = [];
     const rewrittenContent = newPackageFileContent.replace(regEx(/\\\n/g), '');
-    const lines = rewrittenContent.split('\n').map((line) => line.trim());
+    const lines = rewrittenContent
+      .split(newlineRegex)
+      .map((line) => line.trim());
     for (const dep of updatedDeps) {
       const hashLine = lines.find(
         (line) =>
diff --git a/lib/manager/pip_requirements/extract.ts b/lib/manager/pip_requirements/extract.ts
index 25483967caea10ac890cdc55485e102ed588dfbb..9a7e701d3ed0874574f884856d29a41b7654d957 100644
--- a/lib/manager/pip_requirements/extract.ts
+++ b/lib/manager/pip_requirements/extract.ts
@@ -5,7 +5,7 @@ import { GitTagsDatasource } from '../../datasource/git-tags';
 import { PypiDatasource } from '../../datasource/pypi';
 import { logger } from '../../logger';
 import { isSkipComment } from '../../util/ignore';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { ExtractConfig, PackageDependency, PackageFile } from '../types';
 
 export const packagePattern =
@@ -32,7 +32,7 @@ export function extractPackageFile(
 
   let indexUrl: string;
   const extraUrls = [];
-  content.split('\n').forEach((line) => {
+  content.split(newlineRegex).forEach((line) => {
     if (line.startsWith('--index-url ')) {
       indexUrl = line.substring('--index-url '.length).split(' ')[0];
     }
@@ -59,7 +59,7 @@ export function extractPackageFile(
   const pkgRegex = regEx(`^(${packagePattern})$`);
   const pkgValRegex = regEx(`^${dependencyPattern}$`);
   const deps = content
-    .split('\n')
+    .split(newlineRegex)
     .map((rawline) => {
       let dep: PackageDependency = {};
       const [line, comment] = rawline.split('#').map((part) => part.trim());
diff --git a/lib/manager/setup-cfg/extract.ts b/lib/manager/setup-cfg/extract.ts
index d4eec82780fe0522317c2eead85c37e13320e5b9..4c2c30e09f1499bbc6355912e3a3f7fc4ccdf690 100644
--- a/lib/manager/setup-cfg/extract.ts
+++ b/lib/manager/setup-cfg/extract.ts
@@ -1,5 +1,5 @@
 import { PypiDatasource } from '../../datasource/pypi';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import pep440 from '../../versioning/pep440';
 import type { PackageDependency, PackageFile, Result } from '../types';
 
@@ -64,7 +64,7 @@ export function extractPackageFile(
 
   const deps: PackageDependency[] = [];
   content
-    .split('\n')
+    .split(newlineRegex)
     .map((line) => line.replace(regEx(/[;#].*$/), '').trimRight())
     .forEach((rawLine) => {
       let line = rawLine;
diff --git a/lib/manager/terraform/extract.ts b/lib/manager/terraform/extract.ts
index 3034ab895884b14507d063159fcd62819abf8601..66b3bfd66835b12cc356135f1dd9bd658f44d2f6 100644
--- a/lib/manager/terraform/extract.ts
+++ b/lib/manager/terraform/extract.ts
@@ -1,6 +1,6 @@
 import is from '@sindresorhus/is';
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { ExtractConfig, PackageDependency, PackageFile } from '../types';
 import { TerraformDependencyTypes } from './common';
 import { extractLocks, findLockFile, readLockFile } from './lockfile/util';
@@ -54,7 +54,7 @@ export async function extractPackageFile(
   }
   let deps: PackageDependency<TerraformManagerData>[] = [];
   try {
-    const lines = content.split('\n');
+    const lines = content.split(newlineRegex);
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
       const line = lines[lineNumber];
       const terraformDependency = dependencyBlockExtractionRegex.exec(line);
diff --git a/lib/manager/terraform/lockfile/util.ts b/lib/manager/terraform/lockfile/util.ts
index 1121c38a36fb99e48e8deb24981963438b1b9890..9ecd4abb435f3b39f7855a1ee3fba86ca9f7a201 100644
--- a/lib/manager/terraform/lockfile/util.ts
+++ b/lib/manager/terraform/lockfile/util.ts
@@ -1,5 +1,5 @@
 import { getSiblingFileName, readLocalFile } from '../../../util/fs';
-import { regEx } from '../../../util/regex';
+import { newlineRegex, regEx } from '../../../util/regex';
 import { get as getVersioning } from '../../../versioning';
 import type { UpdateArtifactsResult } from '../../types';
 import type {
@@ -31,7 +31,7 @@ export function readLockFile(lockFilePath: string): Promise<string> {
 }
 
 export function extractLocks(lockFileContent: string): ProviderLock[] {
-  const lines = lockFileContent.split('\n');
+  const lines = lockFileContent.split(newlineRegex);
   const blockStarts: number[] = [];
   // get first lines of blocks
   lines.forEach((line, index) => {
@@ -134,7 +134,7 @@ export function writeLockUpdates(
   lockFilePath: string,
   oldLockFileContent: string
 ): UpdateArtifactsResult {
-  const lines = oldLockFileContent.split('\n');
+  const lines = oldLockFileContent.split(newlineRegex);
 
   const sections: string[][] = [];
 
diff --git a/lib/manager/terragrunt/extract.ts b/lib/manager/terragrunt/extract.ts
index aefc1140683eacdb242cd16860f9490776098db4..6d9ed7ddb9ad367c0cee078f02a2675f1c1f05b6 100644
--- a/lib/manager/terragrunt/extract.ts
+++ b/lib/manager/terragrunt/extract.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../logger';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { PackageDependency, PackageFile } from '../types';
 import { TerragruntDependencyTypes } from './common';
 import { analyseTerragruntModule, extractTerragruntModule } from './modules';
@@ -19,7 +19,7 @@ export function extractPackageFile(content: string): PackageFile | null {
   }
   let deps: PackageDependency<TerraformManagerData>[] = [];
   try {
-    const lines = content.split('\n');
+    const lines = content.split(newlineRegex);
     for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
       const line = lines[lineNumber];
       const terragruntDependency = dependencyBlockExtractionRegex.exec(line);
diff --git a/lib/manager/terragrunt/providers.ts b/lib/manager/terragrunt/providers.ts
index 83fc1046cfe09416e93693808b15392616a3c04c..f614cf0c5d866a629b3a3c4ce1089428085ff05b 100644
--- a/lib/manager/terragrunt/providers.ts
+++ b/lib/manager/terragrunt/providers.ts
@@ -1,4 +1,4 @@
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import type { PackageDependency } from '../types';
 import { TerragruntDependencyTypes } from './common';
 import type { ExtractionResult } from './types';
@@ -41,7 +41,7 @@ export function extractTerragruntProvider(
     .slice(lineNumber)
     .join('\n')
     .substring(0, extractBracesContent(lines.slice(lineNumber).join('\n')))
-    .split('\n');
+    .split(newlineRegex);
 
   for (let lineNo = 0; lineNo < teraformContent.length; lineNo += 1) {
     line = teraformContent[lineNo];
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index 50755715aef477cdc0fc16d22eb92fd80cc5ffad..abb4d952ae3d648a2e1ded4fa7c4c6d73b7f55b5 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -21,7 +21,7 @@ import {
   BitbucketServerHttp,
   setBaseUrl,
 } from '../../util/http/bitbucket-server';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 import { sanitize } from '../../util/sanitize';
 import { ensureTrailingSlash, getQueryString } from '../../util/url';
 import type {
@@ -983,7 +983,7 @@ export async function mergePr({
 }
 
 export function massageMarkdown(input: string): string {
-  logger.debug(`massageMarkdown(${input.split('\n')[0]})`);
+  logger.debug(`massageMarkdown(${input.split(newlineRegex)[0]})`);
   // Remove any HTML we use
   return smartTruncate(input, 30000)
     .replace(
diff --git a/lib/util/exec/docker/index.ts b/lib/util/exec/docker/index.ts
index 0096cfa7c15f8ea939c191bdd3f7dbc00c607973..1d04653a280ba8fa41aeed5c298b0e1d34e5582c 100644
--- a/lib/util/exec/docker/index.ts
+++ b/lib/util/exec/docker/index.ts
@@ -4,7 +4,7 @@ import { SYSTEM_INSUFFICIENT_MEMORY } from '../../../constants/error-messages';
 import { getPkgReleases } from '../../../datasource';
 import { logger } from '../../../logger';
 import * as versioning from '../../../versioning';
-import { regEx } from '../../regex';
+import { newlineRegex, regEx } from '../../regex';
 import { ensureTrailingSlash } from '../../url';
 import { rawExec } from '../common';
 import type { DockerOptions, Opt, VolumeOption, VolumesPair } from '../types';
@@ -173,7 +173,7 @@ export async function removeDanglingContainers(): Promise<void> {
     if (res?.stdout?.trim().length) {
       const containerIds = res.stdout
         .trim()
-        .split('\n')
+        .split(newlineRegex)
         .map((container) => container.trim())
         .filter(Boolean);
       logger.debug({ containerIds }, 'Removing dangling child containers');
diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts
index 09ea3d52b8e746c56e9eed92be2fdf4058aebbc1..34e8f8eb8c22934aa6fc9973aa4b77390a43a1f5 100644
--- a/lib/util/git/index.ts
+++ b/lib/util/git/index.ts
@@ -24,7 +24,7 @@ import { ExternalHostError } from '../../types/errors/external-host-error';
 import type { GitProtocol } from '../../types/git';
 import { api as semverCoerced } from '../../versioning/semver-coerced';
 import { Limit, incLimitedValue } from '../../workers/global/limits';
-import { regEx } from '../regex';
+import { newlineRegex, regEx } from '../regex';
 import { parseGitAuthor } from './author';
 import { getNoVerify, simpleGitConfig } from './config';
 import {
@@ -132,7 +132,7 @@ async function fetchBranchCommits(): Promise<void> {
   }
   try {
     (await git.raw(opts))
-      .split('\n')
+      .split(newlineRegex)
       .filter(Boolean)
       .map((line) => line.trim().split(regEx(/\s+/)))
       .forEach(([sha, ref]) => {
@@ -173,7 +173,7 @@ async function deleteLocalBranch(branchName: string): Promise<void> {
 
 async function cleanLocalBranches(): Promise<void> {
   const existingBranches = (await git.raw(['branch']))
-    .split('\n')
+    .split(newlineRegex)
     .map((branch) => branch.trim())
     .filter((branch) => branch.length)
     .filter((branch) => !branch.startsWith('* '));
@@ -428,7 +428,7 @@ export async function getFileList(): Promise<string[]> {
     return [];
   }
   return files
-    .split('\n')
+    .split(newlineRegex)
     .filter(Boolean)
     .filter((line) => line.startsWith('100'))
     .map((line) => line.split(regEx(/\t/)).pop())
diff --git a/lib/util/git/private-key.ts b/lib/util/git/private-key.ts
index 1c3f6bfe66e3b7953ce0ed17dfcbfa86226416b2..834c0930a1c874f6e96520445246f27082e13016 100644
--- a/lib/util/git/private-key.ts
+++ b/lib/util/git/private-key.ts
@@ -4,6 +4,7 @@ import upath from 'upath';
 import { PLATFORM_GPG_FAILED } from '../../constants/error-messages';
 import { logger } from '../../logger';
 import { exec } from '../exec';
+import { newlineRegex } from '../regex';
 
 let gitPrivateKey: string;
 let keyId: string;
@@ -21,7 +22,7 @@ async function importKey(): Promise<void> {
   const { stdout, stderr } = await exec(`gpg --import ${keyFileName}`);
   logger.debug({ stdout, stderr }, 'Private key import result');
   keyId = (stdout + stderr)
-    .split('\n')
+    .split(newlineRegex)
     .find((line) => line.includes('secret key imported'))
     .replace('gpg: key ', '')
     .split(':')
diff --git a/lib/util/regex.ts b/lib/util/regex.ts
index d1da43bea11d1c7cbc51b4181061eef34c6a5f16..4b0e112384012bdcab40d29692b05be754f15c7b 100644
--- a/lib/util/regex.ts
+++ b/lib/util/regex.ts
@@ -49,6 +49,8 @@ export function escapeRegExp(input: string): string {
   return input.replace(regEx(/[.*+\-?^${}()|[\]\\]/g), '\\$&'); // $& means the whole matched string
 }
 
+export const newlineRegex = regEx(/\r?\n/);
+
 const configValStart = regEx(/^!?\//);
 const configValEnd = regEx(/\/$/);
 
diff --git a/lib/workers/pr/changelog/release-notes.ts b/lib/workers/pr/changelog/release-notes.ts
index 192785bb20fcb4b05026575d28e050ae54dfd6bd..aa5591149d612a76339e2d04def70423bac367dc 100644
--- a/lib/workers/pr/changelog/release-notes.ts
+++ b/lib/workers/pr/changelog/release-notes.ts
@@ -6,7 +6,7 @@ import { logger } from '../../../logger';
 import * as memCache from '../../../util/cache/memory';
 import * as packageCache from '../../../util/cache/package';
 import { linkify } from '../../../util/markdown';
-import { regEx } from '../../../util/regex';
+import { newlineRegex, regEx } from '../../../util/regex';
 import * as github from './github';
 import * as gitlab from './gitlab';
 import type {
@@ -136,7 +136,7 @@ export async function getReleaseNotes(
 
 function sectionize(text: string, level: number): string[] {
   const sections: [number, number][] = [];
-  const lines = text.split('\n');
+  const lines = text.split(newlineRegex);
   const tokens = markdown.parse(text, undefined);
   tokens.forEach((token) => {
     if (token.type === 'heading_open') {
@@ -254,7 +254,7 @@ export async function getReleaseNotesMd(
             regEx(/[[\]()]/g),
             ' '
           );
-          const [heading] = deParenthesizedSection.split('\n');
+          const [heading] = deParenthesizedSection.split(newlineRegex);
           const title = heading
             .replace(regEx(/^\s*#*\s*/), '')
             .split(' ')
diff --git a/lib/workers/pr/code-owners.ts b/lib/workers/pr/code-owners.ts
index 8fcdbfe7094885f41ef71d0c7c5f8184e41d1d47..52f4361546e04565e62a5188b49d982bd1f43610 100644
--- a/lib/workers/pr/code-owners.ts
+++ b/lib/workers/pr/code-owners.ts
@@ -3,7 +3,7 @@ import { logger } from '../../logger';
 import { Pr } from '../../platform';
 import { readLocalFile } from '../../util/fs';
 import { getBranchFiles } from '../../util/git';
-import { regEx } from '../../util/regex';
+import { newlineRegex, regEx } from '../../util/regex';
 
 export async function codeOwnersForPr(pr: Pr): Promise<string[]> {
   logger.debug('Searching for CODEOWNERS file');
@@ -23,7 +23,7 @@ export async function codeOwnersForPr(pr: Pr): Promise<string[]> {
 
     const prFiles = await getBranchFiles(pr.sourceBranch);
     const rules = codeOwnersFile
-      .split('\n')
+      .split(newlineRegex)
       .map((line) => line.trim())
       .filter((line) => line && !line.startsWith('#'))
       .map((line) => {
diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts
index 26dd516895d4f703fc34edffd923f6afac94a01a..655e7e067eeae7ad35f96fef7de45ccaa70fc2c9 100644
--- a/lib/workers/repository/updates/generate.ts
+++ b/lib/workers/repository/updates/generate.ts
@@ -4,7 +4,7 @@ import semver from 'semver';
 import { mergeChildConfig } from '../../../config';
 import { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages';
 import { logger } from '../../../logger';
-import { regEx } from '../../../util/regex';
+import { newlineRegex, regEx } from '../../../util/regex';
 import { sanitize } from '../../../util/sanitize';
 import * as template from '../../../util/template';
 import type { BranchConfig, BranchUpgradeConfig } from '../../types';
@@ -198,7 +198,7 @@ export function generateBranchConfig(
     );
     if (upgrade.toLowerCase) {
       // We only need to lowercase the first line
-      const splitMessage = upgrade.commitMessage.split('\n');
+      const splitMessage = upgrade.commitMessage.split(newlineRegex);
       splitMessage[0] = splitMessage[0].toLowerCase();
       upgrade.commitMessage = splitMessage.join('\n');
     }
@@ -228,7 +228,7 @@ export function generateBranchConfig(
         upgrade.prTitle = upgrade.prTitle.toLowerCase();
       }
     } else {
-      [upgrade.prTitle] = upgrade.commitMessage.split('\n');
+      [upgrade.prTitle] = upgrade.commitMessage.split(newlineRegex);
     }
     upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';
     if (upgrade.isGroup) {