Sedは条件付きでEOLを削除します。

Sedは条件付きでEOLを削除します。

末尾に「\」がある次の例では、\ および EOL 文字を削除する必要があります。

line 1\
line 2
line 3
line 4\
line 5

出力は

line 1 line 2
line 3
line 4 line 5

viを使用すると、次のように上記の内容を取得できます。:%s/\//n//g

ただし、端末でこれを行うと機能しません。どんな提案がありますか?

答え1

うーん...私が試したViエディタでは、Viの置き換えは機能しません。それはおそらく:%s/\\\n/ /gVimではうまくいきますが、Viではうまくいきません。


$ sed '/\\$/{N;s/\\\n/ /;}' file
line 1 line 2
line 3
line 4 line 5

これは、現在の行がバックスラッシュで終わるかどうかを検出し、その場合は次の行を追加し(sedその間に改行を追加します)、バックスラッシュと改行を空白文字に置き換えます。

連続した2行の末尾にバックスラッシュがあると失敗します。これを行うには、次のようなものを使用します。

sed ':top;/\\$/{N;s/\\\n/ /;btop;}' file

ここでバックスラッシュのある行が処理されると、コードは最初に戻ります。

最後のスクリプトの注釈付きバージョンsed:

:top;             # define label "top"
/\\$/{            # the line ends with backslash
    N;            # append next line to pattern space with embedded newline
    s/\\\n/ /;    # substitute backslash and newline with space
    btop;         # branch to "top"
}
                  # (implicit print)

関連情報