sedを使って改行だけの行、ファイル内の空行を削除したり その他の改行の操作をする

2024年12月30日

ファイル内の空行を削除

sed.exe -e "/^$/d" input.txt > output.txt

コマンドの説明

  • /^$/d: 空行(行の開始と終了の間に何もない行)を削除します。
  • ^$: 空行を示す正規表現。
  • d: 削除(delete)を意味します。

テキストファイル内の改行をカンマに変換し、「…」が見つかった場合、その後に改行を追加

sed.exe -e ":loop" -e "N" -e "$!bloop" -e "s/\n/,/g" -e "s/…/…\n/g" y:\out1.txt > y:\out.txt

コマンドの説明

  • -e ":loop": ラベル loop を作成します。
  • -e "N": 次の行を現在のパターン空間に追加します。
  • -e "$!bloop": ファイルの最後の行でない限り、ラベル loop に戻ります。
  • -e "s/\n/,/g": 改行をカンマに置き換えます。
  • -e "s/…/…\n/g": 「…」を見つけた場合、その後に改行を追加します。

実行例

例えば、y:\out1.txt に以下のような内容があるとします:

行1
行2
行3…行4

このコマンドを実行すると、y:\out.txt には以下のような出力が得られます:

行1,行2,行3…
行4

各行の末尾にキャリッジリターン(\r)を追加

正規表現でCRLF(キャリッジリターン+ラインフィード)を表すには、\r\n を使用します。

sed.exe -e "s/$/\r/g" y:\out1.txt > y:\out.txt

改行コードを変更する

コマンドの説明

  • s/$/\r/g: 各行の終わり ($) にキャリッジリターンを追加します。
  • \r: キャリッジリターン。

例えば、y:\out1.txt に以下のような内容がある場合:

行1
行2
行3

このコマンドを実行すると、y:\out.txt の内容は次のようになります:

行1\r
行2\r
行3\r

CRLF(キャリッジリターン+ラインフィード)をLF(ラインフィード)のみに変換しながら、全ての行を連結

sed.exe -e ":loop" -e "N" -e "$!bloop" -e "s/\r\n/\n/g" y:\out1.txt > y:\out.txt

コマンドの構成

  • -e ":loop": ラベル loop を作成。
  • -e "N": 次の行を現在のパターン空間に追加。
  • -e "$!bloop": ファイルの最後の行でない限り、ラベル loop に戻る。
  • -e "s/\r\n/\n/g": CRLFをLFに置き換えます。

実行例

例えば、y:\out1.txt に以下のような内容が含まれている場合:

行1\r\n
行2\r\n
行3\r\n

コマンドを実行すると、y:\out.txt に次のような出力が得られます:

行1\n
行2\n
行3\n

4行ごとにカンマで区切り、1行にまとめる

sed.exe -e "N" -e "N" -e "N"  -e "s/\(.*\)\n\(.*\)\n\(.*\)\n\(.*\)/\1,\2,\3,\4/g" y:\out1.txt > y:\out.txt

コマンドの説明

  • -e "N": 次の行を現在のパターン空間に追加します。これを3回繰り返します。
  • -e "s/\(.*\)\n\(.*\)\n\(.*\)\n\(.*\)/\1,\2,\3,\4/g": 各4行をカンマで区切って一行にまとめます。

実行例

例えば、y:\out1.txt に以下のような内容があるとします:

行1
行2
行3
行4
行5
行6
行7
行8

このコマンドを実行すると、y:\out.txt の内容は次のようになります:

行1,行2,行3,行4
行5,行6,行7,行8

次のコマンドでも OK です

sed.exe -e "N;N;N" -e "s/\n/,/g" y:\out1.txt > y:\out.txt

指定された文字数ごとに改行を挿入する。

sed -E 's/(.{10})/\1\n/g' ファイル名 > 出力ファイル名

例えば、10文字ごとに改行を挿入する場合:

説明

  • -E: 拡張正規表現を使用。
  • s/(.{10})/\1\n/g: 10文字ごとに改行を挿入。
  • (.{10}): 任意の10文字のグループ。
  • \1\n: そのグループの後に改行を追加。

実行例

例えば、ファイル input.txt の内容が次のような場合:

12345678901234567890
abcdefghijklmnopqrst

このコマンドを実行すると、output.txt の内容は次のようになります:

1234567890
1234567890
abcdefghij
klmnopqrst

行の先頭にあるカンマを削除する

sed.exe -e "s/^,*//"

コマンドの説明

  • s/^,*//: 行の先頭 (^) にある0個以上のカンマ (,*) を削除します。

実行例

例えば、y:\out1.txt に以下のような内容がある場合:

,行1
,,行2
,,,行3

このコマンドを実行すると、y:\out.txt の内容は次のようになります:

行1
行2
行3

sed のホールドスペース操作コマンド一覧

コマンド説明
hホールドスペースの内容をパターンスペースの内容で置き換えます。
Hホールドスペースの内容末尾に改行を追加し、更にパターンスペースの内容を追加します。
gパターンスペースの内容をホールドスペースの内容で置き換えます。
Gパターンスペースの内容末尾に改行を追加し、更にホールドスペースの内容を追加します。
xパターンスペースの内容とホールドスペースの内容を交換します。

コマンドの詳細とサンプル

1. h コマンド

ホールドスペースの内容をパターンスペースの内容で置き換えます。

echo -e "line1\nline2" | sed 'h'

結果:

line1

2. H コマンド

ホールドスペースの内容末尾に改行を追加し、更にパターンスペースの内容を追加します。

echo -e "line1\nline2" | sed 'H'

結果:

line1
line2

3. g コマンド

パターンスペースの内容をホールドスペースの内容で置き換えます。

echo -e "line1\nline2" | sed 'h;g'

結果:

line1

4. G コマンド

パターンスペースの内容末尾に改行を追加し、更にホールドスペースの内容を追加します。

echo -e "line1\nline2" | sed 'h;G'

結果:

line1
line1
line2

5. x コマンド

パターンスペースの内容とホールドスペースの内容を交換します。

echo -e "line1\nline2" | sed 'h;x'

結果:

line2
line1

bat

Posted by eightban