regex - sed 用单个空行替换多个空行

标签 regex sed blank-line

我写了一个 sed 脚本,它用一个空行替换了多个空行,但它没有按预期工作。我会感谢每一个人,谁能解释我为什么。请不要让我引用工作示例,我熟悉 Google。我只是想了解 sed 是如何工作的。

代码是

sed ':a;/^\n*$/{N;ba};s/^\n\n*/\n/' input_file

所以逻辑很简单:当 sed 读取该行并且它是空白的或有几个换行符(这是 /^*\n$ 条件)时,我告诉 sed 将下一行附加到模式空间。一旦找到非空行,替换 s/^\n\n*/\n/已经完成了。

除了文件末尾有空行的情况外,一切正常。这些空白没有被单个空白替换,我不明白为什么。

有任何想法吗?

最佳答案

问题是sed获取 EOF在阅读下一行时。

在使用 N 阅读下一行时,您的命令已完成。 .因为,在阅读下一行时,sed获取 EOF .所以,它不会处理 s/^\n\n*/\n/代换。这就是为什么,您无法删除出现在文件末尾的空行序列。

我的解决办法是:

sed ':a; /^\n*$/{ s/\n//; N;  ba};' yourfile

关于regex - sed 用单个空行替换多个空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24781112/

相关文章:

bash - 如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

c++ - 文件最后一行为空时的停止条件 C++

linux - 从文本文件 shell 脚本中删除 "empty"行

如果字符串包含非法字符,则返回 Java 函数

javascript - 使用 reduce 检查数组是否包含与字符串匹配的正则表达式

regex - 在 sed 搜索/替换中访问匹配?

xml - 我的 XSLT 过滤器如何避免在删除元素时在输出 XML 中留下空行,而不更改缩进?

php - 修剪字符串中的多个换行符和多个空格?

python - 仅捕获正则表达式匹配的字符中的相同字符

linux - 从一个文件复制内容并需要使用 sed 替换到另一个文件中