sed 删除范围内的行

sed 删除范围内的行

我有一个 xml 文件。我正在尝试仅删除一系列行中的空白行。在此示例中,我要检查第 55-57 行并删除所有空白行。

这需要在 shell 脚本中通过多个均为 xml 的文件来完成。这是 RHEL 7 系统。

我尝试使用sed,但无法删除空行。

我已经编写了获取适当行号的语句,它们在 shell 脚本中存储为 vars ( start_line, finish_line)

示例文件:

1.
2. 
3. <Test></Test>
        .
        .
        .
55.
56.
57.<!-- keep the comment -->
58. <KeepTag></KeepTag>

如何仅删除 55-57 范围内的空白行?

答案1

你可以轻松地做到这一点:

awk 'FNR>=55 && FNR<=57 && NF==0{next}1' file

这使用了通常的速记符号,即“主程序体”中的awka (即 中的外部特定于规则的代码)表示“打印当前行,包括由规则执行的任何修改”。1{ ... }

但是,它print通过发出命令来next绕过此命令如果适用以下标准:

  • 行号介于(并包括)55 和 57 之间(条件:FNR>=55 && FNR<=57FNR是每个文件的行号 - 与NR,全局行号相反,如果您用于awk在一次调用中处理多个文件,则行号可能会有所不同! )

  • 该行不包含文本,由 表示NF,内容字段的数量为零。

由于这种“绕过”,awk如果空行落在指定的行范围内,则 生成的输出将排除空行。

答案2

使用 sed,您可以使用地址范围来做到这一点

sed '55,57{/^$/d}' file

这将在第 55 行和第 57 行 (55,57) 之间的选定空行 (/^$/) 上应用 d 命令(删除)。我无法测试它,但我认为你必须添加一个“;”在 macOS 中的 d 命令之后。

使用

sed -i '55,57{/^$/d;}' file

如果你想在本地修改你的文件

答案3

sed

start_line=55
finish_line=57
sed "$start_line","$finish_line"'{/^$/d;}' file

相关内容