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/ /g哪个可以在 Vim 中工作,但不能在 Vi 中工作。


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

这会检测当前行是否以反斜杠结尾,如果是,则会附加下一行(sed将在它们之间添加换行符),并用空格字符替换反斜杠和换行符。

如果连续两行末尾有反斜杠,这将失败。为此,请使用类似的东西

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)

相关内容