Windows10 VSCode の改行について
Windows10 VSCode の改行について備忘録としてまとめてみました。
まず改行コードから見ていきます。
改行コードは改行を表す特殊な文字コードのことで、OS によって次のように異なります。
[OS] [改行コード]
Windows系 CRLF(\r\n)
Mac(9以前) CR(\r)
UNIX系、Mac(10以降) LF(\n)
例えば、Windows10 の VSCode でテキストファイルを作ると、エディタ右下のステータスバーに以下のように CRLF と表示されます。
ちなみに「CRLF」をクリックして LF を選択すると、文字コードが LF に切り替わります。
デフォルトの改行コードを変えたい場合は、設定の settings.json に以下を追加します。
"files.eol": "\n" // LF に変更
Windows10 VSCode の改行で気をつける点
1. Windows10 の VSCode では、CRLF(\r\n) にマッチする正規表現が \n になっています。\r\n ではマッチしないので、VSCode で検索・置換で正規表現を使う場合、CRLF と LF の区別がつきません。
2. 改行コードを表示(可視化)する拡張機能を使えば、CRLF と LF を区別することができます。ただし、一つのファイルに CRLF と LF が混在する場合、正確に CRLF と LF を区別することができません。混在ファイルで CRLF と LF を区別したい場合、WSL2 で file や cat -e のコマンドを打てば確認できます。
3. 正規表現の「\s」は、「空白文字」のことで、スペース、タブ、改行などを表します。なので、「改行を含む任意の文字列」を表す正規表現は「[\s\S]*」だと思いきや、これだとうまくマッチしません。\n を追加して [\s\S\n]* にすると、正規表現でマッチします。
以上のことを実際に簡単な例を挙げながら検証してみます。
今回、test というフォルダを作って、その中に次の三つのファイルを用意しました。(CRLF と LF の混在ファイルは、VSCode では作れないので、今回ファイルはサクラエディタを使って作りました)
test/
├── win.txt
├── unix.txt
└── mix.txt
実際に試してみたい方は、以下からダウンロードできます。
win.txt は、改行コードが CRLF(\r\n) のみで、中身は次のとおりです。
unix.txt は、改行コードが LF(\n) のみで、中身は次のとおりです。
mix.txt は、改行コードが CRLF(\r\n) と LF(\n) が混在したファイルで、中身は次のとおりです。(最初の二行が CRLF、残りの二行が LF)
では、1 から順に見ていきます。
1. CRLF と LF の混在ファイルである Mix.txt で、正規表現を使って改行コードを検索してみます。VSCode で Mix.txt を開いてから、「Ctrl + F」で検索ボックスを開きます。正規表現のボタンを押して正規表現が使えるようにします。検索ボックスに「\r\n」を入力した場合、以下のようにいずれの改行コードもマッチしません。
検索ボックスに「\n」を入力した場合、以下のように CRLF も LF もすべての改行コードがマッチします。
2. 改行コードを表示(可視化)する拡張機能「code-eol」をインストールします。win.txt の場合、改行コードが正しく表示されます。
unix.txt の場合、改行コードが正しく表示されます。
mix.txt の場合、どちらか一方の改行コードに統一されます。
混在ファイルで CRLF と LF を区別する方法
Windows10 で Linux/UNIX コマンドが使える WSL2 ターミナル での判別方法(こちらの記事に WSL2 の簡単な使い方がまとめてあるので、参考にしていただけると幸いです)
cat コマンドに -e オプションをつけると以下の改行記号で表示されます。
[改行コード] [改行記号]
CRLF(\r\n) ^M$
CR(\r) ^M
LF(\n) $
~$ cat -e test/win.txt
blue^M$
yellow^M$
red^M$
pink^M$
~$ cat -e test/unix.txt
blue$
yellow$
red$
pink$
~$ cat -e test/mix.txt
blue^M$
yellow^M$
red$
pink$
file コマンドでも判別できます。
CRLF の場合、改行コードが CRLF と表示されます。
LF の場合、改行コードは何も表示されません。
混在ファイルの場合、CRLF, LF と表示されます。
~$ file test/win.txt
test/win.txt: ASCII text, with CRLF line terminators
~$ file test/unix.txt
test/unix.txt: ASCII text
~$ file test/mix.txt
test/mix.txt: ASCII text, with CRLF, LF line terminators
ASCII text は、半角英数字のファイルだからです。それ以外の日本語を含めれば UTF-8 Unicode text となります。
次のような方法もあります。
~$ find test -type f | xargs file | grep CRLF
test/win.txt: ASCII text, with CRLF line terminators
test/mix.txt: ASCII text, with CRLF, LF line terminators
find コマンドで複数のファイルを検索して、その一つ一つのファイルに file コマンドの実行結果を紐づけた状態で、最後の grep コマンドに渡して「CRLF」が含まれる単語を検索して表示しています。
xargs は、複数の実行結果を受け取ってその結果を任意のコマンドに引数として渡すコマンドです。覚えておくと便利です。
unix.txt は何も表示されていないので、改行コードは LF になります。
WSL2(Ubuntu) 上で改行コードを変換したい場合
いろいろな方法がありますが、今回は、nkf コマンドを使って変換してみます。
CRLF から LF への変換は、-Lu オプション(Line break unix)
LF から CRLF への変換は、-Lw オプション(Line break windows)
別名ファイルへの変換は、「> ファイル名」(リダイレクト)
上書きは、--overwrite オプション
文字・改行コードの確認は、--guess
まだ入れてない方は、以下のコマンドでインストール可能です。
~$ sudo apt-get install nkf
CRLF から LF への変換(リダイレクト)
~$ nkf -Lu test/win.txt > test/unix2.txt
~$ nkf --guess !$
nkf --guess test/unix2.txt
ASCII (LF)
CRLF から LF への変換(上書き)
~$ nkf -Lu --overwrite test/win.txt
~$ nkf --guess !$
nkf --guess test/win.txt
ASCII (LF)
unix.txt と unix2.txt だけ LF から CRLF へ変換
~$ find test -name unix* -type f | xargs nkf -Lw --overwrite
~$ nkf --guess test/unix*
test/unix.txt: ASCII (CRLF)
test/unix2.txt: ASCII (CRLF)
3. 改行を含んだ複数行にまたがる任意の文字列を正規表現で検索・置換したい場合、 [\s\S\n]* を使います。
「\s」は、「空白文字」のことで、スペース、タブ、改行など
「\S」は、\s 以外のすべて
「[]」は、例えば、[abc] で、a、b、cのどれか一文字
「*」は、0 か一文字以上
実際に試してみたい方は、以下からダウンロードできます。
以下の複数行のコードを正規表現ですべてマッチさせたい場合、
最小マッチにしたい場合、量指定子「*」の後ろに「?」を加えます。
では、上記のコードをコピペして確認してみます。
検索ボックスに「start[\s\S\n]*?end」と入力します。
2 件マッチしているので、うまくいっているようです。
以上です。お疲れさまでした。