![sed 删除范围内的行](https://linux22.com/image/175353/sed%20%E5%88%A0%E9%99%A4%E8%8C%83%E5%9B%B4%E5%86%85%E7%9A%84%E8%A1%8C.png)
我有一个 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:
awk 'FNR>=55 && FNR<=57 && NF==0{next}1' file
这使用了通常的速记符号,即“主程序体”中的awk
a (即 中的外部特定于规则的代码)表示“打印当前行,包括由规则执行的任何修改”。1
{ ... }
但是,它print
通过发出命令来next
绕过此命令如果适用以下标准:
行号介于(并包括)55 和 57 之间(条件:
FNR>=55 && FNR<=57
,FNR
是每个文件的行号 - 与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