How to Use an EOL Converter for Cross-Platform Compatibility

How to Use an EOL Converter for Cross-Platform Compatibility

Date: March 6, 2026

Different operating systems use different end-of-line (EOL) characters: Linux and macOS use LF ( ), Windows uses CRLF (), and older classic Mac systems used CR ( ). Mismatched EOLs can cause problems with version control, scripts, editors, build tools, and deployments. An EOL converter normalizes line endings so files behave consistently across platforms. This guide shows practical, reliable ways to use an EOL converter and integrates normalization into common workflows.

Why normalize EOLs

  • Prevent merge conflicts: Git diffs and merges are cleaner when line endings are consistent.
  • Avoid script failures: Shell scripts expecting LF can break on CRLF.
  • Consistent tooling behavior: Linters, compilers, and editors often assume a specific EOL.

Choose an approach

Pick one of these depending on scale and workflow:

  1. Editor or IDE settings — best for individual developers.
  2. Command-line tools — good for power users and automation.
  3. Git configuration — ideal for repository-wide consistency.
  4. Pre-commit hooks or CI — enforce normalization automatically.

1) Editor or IDE settings

Most editors can convert EOLs on open/save.

  • VS Code: bottom-right status shows the EOL type; click it and choose LF or CRLF. Enable auto-detection and add “files.eol”: “ ” in settings to default to LF.
  • Sublime Text: View → Line Endings → choose and save.
  • JetBrains IDEs: File → File Properties → Line Separators → set project default.

Use editor settings for small teams or when you control all contributors’ environments.

2) Command-line tools

Useful for batch conversion and scripts.

  • dos2unix / unix2dos

    • Convert Windows → Unix: dos2unix file.txt
    • Convert Unix → Windows: unix2dos file.txt
  • sed (portable)

    • To convert CRLF → LF:

      Code

      sed -i ’s/ \(//' filename </span></code></div></div></pre> </li> <li>To convert LF → CRLF (GNU sed): <pre><div class="XG2rBS5V967VhGTCEN1k"><div class="nHykNMmtaaTJMjgzStID"><div class="HsT0RHFbNELC00WicOi8"><i><svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M15.434 7.51c.137.137.212.311.212.49a.694.694 0 0 1-.212.5l-3.54 3.5a.893.893 0 0 1-.277.18 1.024 1.024 0 0 1-.684.038.945.945 0 0 1-.302-.148.787.787 0 0 1-.213-.234.652.652 0 0 1-.045-.58.74.74 0 0 1 .175-.256l3.045-3-3.045-3a.69.69 0 0 1-.22-.55.723.723 0 0 1 .303-.52 1 1 0 0 1 .648-.186.962.962 0 0 1 .614.256l3.541 3.51Zm-12.281 0A.695.695 0 0 0 2.94 8a.694.694 0 0 0 .213.5l3.54 3.5a.893.893 0 0 0 .277.18 1.024 1.024 0 0 0 .684.038.945.945 0 0 0 .302-.148.788.788 0 0 0 .213-.234.651.651 0 0 0 .045-.58.74.74 0 0 0-.175-.256L4.994 8l3.045-3a.69.69 0 0 0 .22-.55.723.723 0 0 0-.303-.52 1 1 0 0 0-.648-.186.962.962 0 0 0-.615.256l-3.54 3.51Z"></path></svg></i><p class="li3asHIMe05JPmtJCytG wZ4JdaHxSAhGy1HoNVja cPy9QU4brI7VQXFNPEvF">Code</p></div><div class="CF2lgtGWtYUYmTULoX44"><button type="button" class="st68fcLUUT0dNcuLLB2_ ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ CPXAhl7VTkj2dHDyAYAf" data-copycode="true" role="button" aria-label="Copy Code"><svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.975 1h.09a3.2 3.2 0 0 1 3.202 3.201v1.924a.754.754 0 0 1-.017.16l1.23 1.353A2 2 0 0 1 15 8.983V14a2 2 0 0 1-2 2H8a2 2 0 0 1-1.733-1H4.183a3.201 3.201 0 0 1-3.2-3.201V4.201a3.2 3.2 0 0 1 3.04-3.197A1.25 1.25 0 0 1 5.25 0h3.5c.604 0 1.109.43 1.225 1ZM4.249 2.5h-.066a1.7 1.7 0 0 0-1.7 1.701v7.598c0 .94.761 1.701 1.7 1.701H6V7a2 2 0 0 1 2-2h3.197c.195 0 .387.028.57.083v-.882A1.7 1.7 0 0 0 10.066 2.5H9.75c-.228.304-.591.5-1 .5h-3.5c-.41 0-.772-.196-1-.5ZM5 1.75v-.5A.25.25 0 0 1 5.25 1h3.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-3.5A.25.25 0 0 1 5 1.75ZM7.5 7a.5.5 0 0 1 .5-.5h3V9a1 1 0 0 0 1 1h1.5v4a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5V7Zm6 2v-.017a.5.5 0 0 0-.13-.336L12 7.14V9h1.5Z"></path></svg>Copy Code</button><button type="button" class="st68fcLUUT0dNcuLLB2_ WtfzoAXPoZC2mMqcexgL ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ GnLX_jUB3Jn3idluie7R"><svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" d="M20.618 4.214a1 1 0 0 1 .168 1.404l-11 14a1 1 0 0 1-1.554.022l-5-6a1 1 0 0 1 1.536-1.28l4.21 5.05L19.213 4.382a1 1 0 0 1 1.404-.168Z" clip-rule="evenodd"></path></svg>Copied</button></div></div><div class="mtDfw7oSa1WexjXyzs9y" style="color: var(--sds-color-text-01); font-family: var(--sds-font-family-monospace); direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: var(--sds-font-size-label); line-height: 1.2em; tab-size: 4; hyphens: none; padding: var(--sds-space-x02, 8px) var(--sds-space-x04, 16px) var(--sds-space-x04, 16px); margin: 0px; overflow: auto; border: none; background: transparent;"><code class="language-text" style="color: rgb(57, 58, 52); font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: 0.9em; line-height: 1.2em; tab-size: 4; hyphens: none;"><span>sed -i 's/\)/ /’ filename
  • awk / perl

    • Perl one-liner to normalize to LF:

      Code

      perl -pi -e ’s/ ?/ /g’ files…
  • git add –renormalize (see Git section) for repository-wide changes.

Use these in scripts, build steps, or mass-conversion tasks.

3) Git configuration for repos

Configure Git to handle EOLs consistently across platforms.

  • Recommended for cross-platform projects: commit files with LF and let Windows check out with CRLF if needed.
    • Set core.eol and autocrlf:
      • For Windows developers who want CRLF in working tree:

        Code

        git config –global core.autocrlf true
      • For macOS/Linux developers who want LF:

        Code

        git config –global core.autocrlf input
    • Repository-level enforce LF on commit: create a .gitattributes file in the repo root:

      Code

      * text=auto eol=lf
    • To renormalize an existing repo after adding .gitattributes:

      Code

      git add –renormalize . git commit -m “Normalize line endings”

4) Pre-commit hooks and CI enforcement

Automate normalization so contributors can’t accidentally introduce wrong EOLs.

  • Pre-commit framework:

    • Add a hook using a script or existing hook like end-of-file-fixer and trailing-whitespace.
    • Example .pre-commit-config.yaml entry:

      Code

      - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.0.1 hooks:

      • id: end-of-file-fixer
      • id: trailing-whitespace
    • Add a custom hook to run dos2unix on staged files.
  • CI checks:

    • Add a step that runs a normalization check script; fail the build if files contain CRLF where LF is required.

Best practices checklist

  • Pick a canonical EOL for the repo (usually LF).
  • Add .gitattributes to make EOL rules explicit.
  • Use pre-commit hooks to enforce rules locally before committing.
  • Document the project’s EOL policy in CONTRIBUTING.md.
  • Normalize before major merges with git add –renormalize .
  • Prefer tools that are POSIX-friendly in automation for portability.

Quick reference commands

  • Convert file Windows → Unix:
    • dos2unix file.txt
    • perl -pi -e ’s/ ?/ /g’ file.txt
  • Convert file Unix → Windows:
    • unix2dos file.txt
    • sed -i ’s/$/ /’ file.txt (GNU sed)
  • Git renormalize after .gitattributes: