wada811 / blog

wada811's blog
https://github.com/wada811/blog/issues
Apache License 2.0
6 stars 0 forks source link

sed で改行コードを置換する #24

Open wada811 opened 5 years ago

wada811 commented 5 years ago

Why

テキスト中の改行コードを文字列の \n に置換したい。

How

GNU sed

sed -z 's/\n/\\n/g'

BSD sed

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g'

What

sed は1行ごとにパターンスペースに取り込んで処理を行うが、その際に改行コードは含まれない。 そのため、通常では置換できないのでそれぞれ以下のオプション・コマンドを使う。

GNU sed

z オプションにより、改行コードが置換できるようになる。 sed, a stream editor

Treat the input as a set of lines, each terminated by a zero byte (the ASCII ‘NUL’ character) instead of a newline. 入力を一連の行として扱い、各行は改行ではなくゼロバイト(ASCIIの 'NUL'文字)で終了します。

BSD sed

最終行まで各行をパターンスペースに追加するループを実行し、(-e ':a' -e 'N' -e '$!ba') パターンスペースに追加された入力全体に対して置換を行う。(-e 's/\n/\\n/g')

-e ':a'

ラベル。後述の b で使用する。ラベル名は a でなくても良い。

-e 'N'

パターンスペースに次の行を取り込む。改行コードが含まれるようになる。

-e $!ba

$ は最終行を示すアドレス。 ! はアドレスにマッチしない場合のみコマンドを実行する。 b は指定したラベル a に分岐するコマンド。

Ref

[0addr]:label
    This function does nothing; it bears a label to which the `b` and `t` commands may branch.

[2addr]N
    Append the next line of input to the pattern space, using an embedded newline character to separate the appended material from the original contents.  Note that the current line number changes.

Sed Addresses
    An address is not required, but if specified must be a number (that counts input lines cumulatively across input files), a dollar (``$'') character that addresses the last line of input, or a context address (which consists of a regular expression preceded and followed by a delimiter).

[2addr]!function
[2addr]!function-list
    Apply the function or function-list only to the lines that are not selected by the address(es).

[2addr]b[label]
    Branch to the `:` function with the specified label.  If the label is not specified, branch to the end of the script.