Search code examples
regexline-endings

Regex to find and fix LF lineEndings to CRLF


Similar/Related to, but not covered by:


I mostly work in .NET stack, where we want (almost) all our files to be CRLF.

In my opinion, git should never be editing the contents of a file, so my and my projects' and my colleagues' git settings are autocrlf=false (i.e as-is, as-is), feel free to have that debate on some other question :)

Occasionally someone will have bad git settings, or in some other way accidentally introduce LFs into some files in the git repo, and I want to grep the whole repository for files with LF line-endings, and then fix them to be CRLFs, on a file-by-file basis (in case there are, e.g. bash files which should regrettably be LF).

Every time I need to do this, I can't find the relevant Regex and have to work it out from scratch again.

So this question exists to document the correct regex.


Solution

  • Regex to find any LF that is not part of a CRLF:

    (?<!\r)\n

    Regex to find any CR that is not part of a CRLF:

    \r(?!\n)

    Thus Regex to find any non-CRLF lineEnding:

    ((?<!\r)\n|\r(?!\n))

    You can simply replace that with \r\n to fix them all to be CRLFs.


    This is using the "Negative Lookbehind" functionality:

    (?<\!a)b matches a "b" that was not preceded by an "a".

    and the "Negative Lookahead" functionality:

    a(?\!b) matches an "a" that is not followed by a "b".

    Further documentation here: https://www.regular-expressions.info/lookaround.html