【備忘録】改行コード

## 経緯
環境でシェルスクリプトを実行した際にうまくいかず。先輩に相談したところただ改行コードが間違っていたためだと判明。悔しかったので、改行コードのエトセトラを備忘録として残すことにした。

## 改行コード_各OSの違い
どうやらOSによって基本とする改行コードは異なるらしい
以下関係を表にまとめる（表1）


<table>
  <caption>表1.基本とする改行コード</caption>
  <thead>
    <tr>
      <th>改行コード</th> <th>OS</th> <th>概要</th>
    </tr>
  </thead>
  <tr>
    <td> LF </td> <td>UNIX系、macOS（X以降）、iOS、Android</td>　<td> Linuxもこれ</td>
  </tr>
  <tr>
    <td> CRLF </td> <td>Windows</td> <td> - </td>
  </tr>
  <tr>
    <td> CR </td> <td>Mac OS 9以前</td> <td> 現在はメジャーでない </td>
  </tr>
</table>

## 改行コード_正規表現
それぞれの改行コードを正規表現で表すと次のように表せる
置換の際に必要な知識のため、これも表にまとめる（表2）
<table>
  <caption>表2.改行コード正規表現</caption>
  <thead>
    <tr>
      <th>改行コード</th> <th>正規表現</th> 
    </tr>
  </thead>
  <tr>
    <td> LF </td> <td>\n</td>　
  </tr>
  <tr>
    <td> CRLF </td> <td>\r\n</td> 
  </tr>
  <tr>
    <td> CR </td> <td>\r</td> 
  </tr>
</table>

## 改行コード_確認方法
改行コードは様々な方法で確認できる
環境によっていくつか種類があるため、用途に応じて使い分ける
### 1. メモ帳で確認（windows11で確認）
![メモ帳１ 2024-09-28 174807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/c9981276-e46f-da9a-9229-30aa10e3200d.png)
隣にはファイルの文字コードも確認できる
ただし、文字コードが混ざっている場合、メモ帳では`CRLF`が混じっている場合そちらに統一されてしまうようだ
![サクラ１ 2024-09-28 180539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/c81f3785-acc6-c739-42be-ff044060f876.png)![メモ帳２ 2024-09-28 181111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/faeb2042-5ee8-7558-f497-c5c745514cb5.png)

:::note warn
注意
サクラエディタでは<font color='yellow'>黄色枠=CRLF</font>と<font color='red'>赤色枠=LF</font>の区別がつくが、メモ帳ではWindowsの基本となるCRLFのに統一されてしまっている。設定いじれば判別できるようになるのだろうか。。
:::
### 2. サクラエディタで確認
サクラエディタでは目視で改行コードを確認可能。（素晴らしい！！）
さらにカーソルを置いた行の改行コードもそれぞれ識別して表示してくれる。
![スクリーンショット 2024-09-28 182849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/67679d41-12bd-3faa-fd86-44d3878b115c.png)

### 3. Linuxコマンドで確認
いくつかのコマンドで確認することもできる
画像は改行コードを混ぜた場合の表示例
#### 3-1. `od -c`コマンド
```ruby:bash
od -c test.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/7a099c81-8364-1e22-215f-5de3ed6022da.png)
実際のテキスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/60daf62a-3b26-6f15-d790-5bca7a47b5bc.png)
#### 3-2. `file`コマンド
```ruby:bash
file test.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/291bd691-684f-7cf7-67ef-959836cf319b.png)
#### 3-3. `nkf(Network Kanji Filter)`コマンド
```ruby:bash
 nkf --guess test.txt
```
- LFのみの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/2411d678-35ea-6de7-854a-a6dd0135bc58.png)
- 混在の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/1b318c4a-102a-e2d7-c232-7e303bf38273.png)

### 4.Vimで確認
vimエディタでは次のオプションを指定することで改行コードを確認できる
```ruby:vim
:set fileformat?
```
画像は改行コードを混ぜた場合の表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/9134da38-f989-9763-1464-fba261dd7141.png)
unix=LF , dos=CRLF , mac=CRである（なぜか自分の環境では確認できなかった）

:::note warn
注意
Vimはファイル全体を通して複数の改行形式が混在している場合
<font color='red'>もっとも優先度の高い形式</font>に基づいてfileformatを設定する
優先度：LF > CRLF > CR
:::
ちなみに`^M`はCRを含む改行形式（CRLF or CR）とLFを読み込むと表示される
CRLFかCRのみの場合は表示されない
ただしCRのみの場合は表示される（なんでや）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/b95e0196-2b6d-1a3d-2495-f0444492e31c.png)
CRのみのファイルをvimで開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/ac2e924e-bbfb-87ae-4f51-666fb03fdb3f.png)
なぜかfileformat=unixと表示される
この状態で保存するとdosになる(why?)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/23e355c6-51db-527a-58c5-16ba008dacc0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/06eb4ec9-e1b6-d2ca-266c-2cec18db993b.png)
## 改行コード_変換方法
### 1. サクラエディタで変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/b9dbdae5-9326-3ed5-42db-b4813c5e0727.png)
改行コード：CRLF　
CRLF, LF, CRが混在している

- サクラエディタでは入力する改行コードの設定が変更できる
```ruby:sakura
#設定 > 入力改行コード指定
```
- ほかにも保存の際に改行コードを指定して保存できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/199ac15b-f7da-3397-6d05-c39e78071e30.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/975c2e90-9aeb-f492-c9d8-34c54133fa36.png)
```ruby:sakura
	#ショートカットキー： Shift+Ctrl+S
```
### 2. Linuxコマンドで変換
#### 2-1.`nkf(Network Kanji Filter)` コマンド
```ruby:bash
# 【入力ファイル】 を改行コード(LF)へ変換して上書きする
nkf -Lu --overwrite test.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/ad4465c2-516c-cfda-58c0-d10bd6fbcaee.png)

オプション
-Lu : unix形式(LF)
-Lw : windows形式(CRLF)
-Lm : macintosh形式(CR)

#### 2-2. `iconv`コマンドと`tr`コマンドの合わせ技
```ruby:bash
# 【入力ファイル】 の 【入力文字コード】 を 【出力文字コード】 に、
# 改行コードCRLFを改行コードLFへ変換して 【出力ファイル】 へ出力する
iconv -f 【入力文字コード】 -t 【出力文字コード】 【入力ファイル】 | tr -d '\r' > 【出力ファイル】
```
:::note warn
注意
入力ファイルと出力ファイル同じにすると空ファイルになるため注意
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763681/937d4458-72bd-96ce-97be-1768e9357b90.png)
## 参考
https://auroralights.jp/entry/2021/04/03/233553		
https://qiita.com/bezeklik/items/aca37ffb127821311d6b		
https://qiita.com/r18j21/items/78d8501888839b13c770		
https://sakura-editor.github.io/help/HLP000062.html	
https://sakura-editor.github.io/help/HLP000362.html
https://sakura-editor.github.io/help/HLP000285.html
https://qiita.com/waoooon/items/8d982e49692c8145ca4b		
https://qiita.com/hogeo1234/items/76a1873ed4ab327254b5
https://qiita.com/ymm1x/items/b383fec5802f38079162	
https://wakaru-web.com/device/line-feed-code/		

## まとめ
改行コードの確認・変換についてはサクラエディタが便利