使用 ed 删除连续的换行符

使用 ed 删除连续的换行符

输入文件:

1 line1\
2 line2\
3 line3\
4 \
5 line4\
6 \
7 \
8 line5\

期望的输出:

1 line1
2 line2
3 line3
4
5 line4
6
7 line5

POSIX 可以吗ed

删除尾随的反斜杠很容易,但是我怎样才能按照预期的输出处理连续的黑斜杠呢?

答案1

有了sed,你可以这样做:

sed 's/\\$//;/./,/^$/!d'

主要问题之一ed(除了来自另一个时代的语法)是脚本中的错误处理。

ed基本上,如果成功编辑文件,您必须将其视为返回成功。但要进行成功的编辑,您必须使每个命令地址有效、每个命令成功(例如,对于命令s,这意味着至少完成一次替换)。

因此,如果您想检查在这种情况下编辑是否成功,这可能会很棘手。

为了建立@Sukminder的解决方案并尝试覆盖极端情况,可以写:

printf '%s\n' a a . 'g/\\$/s///' ',s/^/a/' 'g/^a$/+1,/./s/^a$//' \
  'v/./d' 'g/^a/s///' '$d' w | ed -s the-file

g如果文件为空,该命令将失败(因为默认地址范围( 1,$)将无效,因此我们需要首先在文件末尾添加一行(使用该a命令)。,s/\\$//如果没有以以下结尾的行,该命令将失败\所以只有当存在这样的行时我们才需要运行它(g/\\$/s///)。

在这里,我们不是插入“xx”(假设在输入中找不到它),而是在每行前面加上“a”,并将要删除的行替换为随后删除的空行。

希望该脚本仅在无法写入文件(命令失败)ed时返回非零退出状态。w不幸的是,我见过ed一些实现在 FS 已满时无法写入文件时返回成功。

IMO,ed最好避免。如今,使用perl -pi.back更加便携且更加可靠。

答案2

不知道如何一口气做到这一点。但是,如果内容众所周知,则可以向双行添加唯一的字符串。

# Add XX to lines that should be deleted
g/^$/+1s/^$/XX/
# Delete them
g/XX/d

不过不太好。

相关内容