ed, ex, echo, cat : ラインエディターを用いた編集 

# Unix系 どんな環境でも編集を行う方法

備忘録として作成

## スクリーンエディターが使えない局面
- 最近はVSCodeやAtomなど優れたエディターがあり、vim/viやemacsも依然人気がある
- しかしコンテナなど限定された環境や、相当年数が経過したシステム設定を変更しようとすると、いつものエディターが使えない場合もある
- そこでどんな局面でも設定を行うレスキュー策を自分なりにまとめた
- ラインエディターのed,ex、ファイル表示用のcat、文字列出力用のechoを使う例を記載

## ed
- UNIXオペレーティングシステム用のラインエディタ。作者はケン・トンプソン
- ほぼ全てのUnixで使える
- これを基に ex , vi が作られたので vi のコマンドラインモード（exモード）と操作方法は似ている
- 起動方法：

```shell
$ ed test.txt　          // edがコマンド名。test.txtはファイル名
95　　　　 　　　　　　　　// ファイルの文字数が表示される
                         // 入力待ち（何も表示されない）

$ ed -p : test.txt　　 　// 後述のexと見た目を合わせたい場合は"-p : "の付加で":"を入力待ち受け記号に出来る
95　　　　 　　　　　　　　// ファイルの文字数が表示される
:                       // 入力待ち
```

- テキストファイルの表示：　（以降の入力待ちの表示文字を：とする）

```
:,p　　　　　　　　　　　 // 待ち受け記号 : （上で指定）に対して ",p"を入力すると全行表示
                        // ","は、ファイルの全行を示し、pはprintを示すので、",p"は全行表示となる
This is No.1 line.
This is No.2 Line.
This is No.3 Line.
:

:2,3n　　　　　　　　　　　 // "2,3"は、2〜3行を対象とする指定で、"n"は行番号付きのprintを示す
2 This is No.2 Line.
3 This is No.3 Line.
:

:.　　　　　　　　　　　  // "."は、いわゆるカーソル行を示す。"."と".p"は同じ
This is No.3 Line.
:

:.=                     // ".="は、行番号を示す。".="と".=p"は同じ
3
:

:2                     // 行移動は直接行番号を入力
This is No.2 Line.
:
```

- 文字入力：　aコマンド　カーソル行の下に文章を追加
- 注：下記はカーソルを２行目に移動して入力する例
- vi/vim同様にiコマンドも使える。iコマンドの場合、カーソル行の上に文章が追加される

```
:2                     // 行移動
This is No.2 Line.
:a                     // "a" (addコマンド）でテキスト入力モードに移行。入力が終わったら"."を入力
This line has been inserted.
The add command can insert multiple lines.　　　　　// 複数行の入力が可能
.               　　　 // ここでテキスト入力完了
:

:,n　　　　　　　　　　　// 上記の入力を表示
1 This is No.1 line.
2 This is No.2 Line.
3 This line has been inserted.
4 The add command can insert multiple lines.
5 This is No.3 Line.
:
```

- 行の削除：　行単位で削除となり文字や単語単位の削除は出来ない（後述の置換は可能）

```
:d                     // カーソル行を削除
:

:4d　　　　　　　　　　　// ４行目を削除
:

:2,25d                 // 2〜25行をまとめて削除
:
```

- 行の変更：　cコマンド　指定行を削除して新しい文章を挿入（複数行可能）。

```
:,p　　　　　　　　　　　// 変更前を表示
This is No.1 line.
This is No.2 line.
This line has been inserted.
The add command can insert multiple lines.
This is No.3 line.
:

:4,5c                  // 4〜5行目を削除して新たな行と入れ替える
This is No.4 line.
.                      // テキスト入力完了

:,p                    // 変更後を表示
This is No.1 line.
This is No.2 line.
This line has been inserted.
This is No.4 line.
:
```

- 検索：　後方検索時は"/文字列"と入力。前方検索時は"?文字列"と入力。
- 置換：　sコマンド　s/old/new/で、oldをnewに置き換える。この置換は、行単位で一番最初に一致した文字列のみ置換するので、一致する文字列を全て変換する場合はgオプションが必要。s/old/new/g
- 保存： wコマンド　vi同様。変更内容を保存。ファイル名を指定するとそのファイル名で保存。
- 終了： qコマンド　vi同様。（強制終了は大文字のQ）

```
:w                   // 保存コマンド
126                  // 保存された文字数が表示される

:q                   // 終了コマンド　（wqと打てば保存終了）
$
```

## ex
- 1976年にBill Joy によって書かれたUnixシステム用のラインエディタ
- exは最終的にフルスクリーンのビジュアルインターフェイスを与えられ、viとなった
- 現在exはviの一部として実装されている。viには「exモード」があり、exコマンドを使用して呼び出すか、vi内から":"を入力して呼び出す 。exとviの機能は重複しているが、exコマンドでしか実行できないものもあるため、viを使用する場合にも役立つ。つまり現在に於いてex=viと考えて良い（vimも同様）。
- 起動方法：

```shell
$ ex test　     　　　　　// exがコマンド名。 testはファイル名
"test" 6L, 126C
Entering Ex mode.  Type "visual" to go to Normal mode.    //visualと打つとvi/vimの標準画面に移動する
:
```

- テキストファイルの表示：　%コマンド

```
:%                      // 全行を表示
This is No.1 line.
This is No.2 line.
This is No.3 line.
:

:2                     // 行移動は直接行番号を入力
This is No.2 line.
:
```

- 文字入力：　aコマンド　カーソル行の下に文章を追加　
- 注：下記はカーソルを２行目に移動して入力させる例
- vi/vimと同じなのでiコマンドも使える。iコマンドの場合、カーソル行の上に文章が追加される。

```
:2                     // 2行目に移動
:a                     // "a" (addコマンド）でテキスト入力モードに移行。入力が終わったら"."を入力
This line has been inserted.
The add command can insert multiple lines.　　　　　// 複数行の入力が可能
.               　　　 // ここでテキスト入力完了
:

:%　　　　　　　　　　　// 上記の入力を表示
This is No.1 line.
This is No.2 line.
This line has been inserted.
The add command can insert multiple lines.
This is No.3 line.
:
```

- 検索、置換、保存、終了はvi/vimと同一

## cat

- catはUNIXの標準コマンドで、ファイルを連結させたり表示したりするのに用いる
- 連結することを意味する「catenate」の略
- catを用いてのテキストファイルの作成も可能。但し後からの編集は追記のみ可能。
- catコマンドに標準入力-を渡し（渡さなくても可能）、複数行を書き込み完了したらCtl+C（ Ctl+D ）で抜ける

> viを開発したBill Joy氏は「どのエディターが使いやすいか」というインタビューに対し、「catが使いやすい」と答えたとのこと。編集不可で後戻りも出来ないツールが使いやすいというのは常人では理解不能な世界。

```
$ cat > test.txt      // 指定したファイル名の中身は、ゼロからの新規作成になる事に注意
This is No.1 line.
This is No.2 line.
This is No.3 line.
^C                      // 編集作業が完了したら Ctl+C （ Ctl+D ）
$

$ cat -n test.txt         // 編集内容を確認
1 This is No.1 line.
2 This is No.2 line.
3 This is No.3 line.
$

$ cat >> test.txt      // >>でファイルの最後尾に追記出来る
Add No.4 line.
Add No.5 line.
^C                      // 編集作業が完了したら Ctl+C （ Ctl+D ）
$

$ cat -n test.txt         // 編集内容を確認
1 This is No.1 line.
2 This is No.2 line.
3 This is No.3 line.
4 Add No.4 line.
5 Add No.5 line.
$
```

## echo

- Unixのechoコマンドは、入力として引数で与えられた文字列をそのまま出力するコマンド
- 何らかの理由であらゆる外部コマンドが使えないなどの非常時の際にも、内部コマンドであることが多いため使える
- echoのリダイレクトを利用する
- 標準出力から > でファイルに上書きとなり >> でファイルに追記
- ファイル閲覧も内部コマンドreadと組み合わせて行える（catやlessが動かない場合）
- まさに最終手段

```
$ echo "This is No.1 line.
> This is No.2 line.                // 途中改行で複数行の入力も可能
> This is No.3 line." > test.txt    // 指定したファイル名の中身は、ゼロからの新規作成になる事に注意

$ read -rd '' file <test.txt ; echo "$file"　　　// 編集内容をreadで確認
This is No.1 line.
This is No.2 line.
This is No.3 line.
$

$ echo "Add No.4 line.
> Add No.5 Line.                  // 途中改行で複数行の入力が可能
> Add No.6 Line." >> test.txt     // >>でファイルの最後尾に追記出来る

$ read -rd '' file <test.txt ; echo "$file"　　　// 編集内容をreadで確認
This is No.1 line.
This is No.2 line.
This is No.3 line.
Add No.4 line.
Add No.5 line.
Add No.6 line.
$
```

## その他の手段

- sedなど他にも方法あり