![Sed 有条件删除 EOL](https://linux22.com/image/137977/Sed%20%E6%9C%89%E6%9D%A1%E4%BB%B6%E5%88%A0%E9%99%A4%20EOL%20.png)
对于以下示例,末尾有“\”,应删除 \ 和 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)