仅删除第一行换行符

Remove only first line break

我有很多文件想要删除特定的换行符。该行始终以 "Title:" 开头,因此我尝试了以下命令:

find . -type f -exec sed -i 's/^Title: \n\t*/Title:/g' {} \;

但据我了解,sed 一次只能处理一行,因此上述方法不起作用。有没有办法删除换行符(在多个文件中),但前提是该行以某个字符串开头?

使用 GNU sed,您可以使用

sed '/^Title: $/{N;s/.*\n\t*\(.*\)/Title:/}'

online sed demo

详情

  • /^Title: $/ - 查找内容等于 Title:
  • 的行
  • {N;s/.*\n\t*\(.*\)/Title:/} - 找到上述行后执行的块:
    • N - 获取下一行并将换行符和该行附加到模式 space
    • s/.*\n\t*\(.*\)/Title:/ - 使用匹配的 .*\n\t*\(.*\) 模式替换模式 space(现在包含两行)
      • .* - 任何 0+ 个字符
      • \n\t* - 换行符和 0+ 个制表符
      • \(.*\) - 捕获第 1 组:任何 0+ 个字符
      • /Title:/ - 替换模式,Title: 和第 1 组中的值。

我会这样做:

sed '/^Title:/{N;s/[[:blank:]]*\n[[:blank:]]*/ /}'

这将查找以字符串 "Title:" 开头的任何行。它将在输入中附加一个换行符和下一行。然后它将搜索一个换行符,可选地在 and/or 前面跟任意数量(零个或多个)的空白字符 - 意思是 space 或制表符 - 它会用一个 [= 替换整个东西25=].

这假设 "Title:" 行也可能包含其他文本(在同一行)并且应该保留。这是我对你的问题的理解,从你的文字来看(虽然它与你的尝试不符)。

如果您的输入可能包含以 "Title:" 开头的两行连续行(此解决方案会将它们合并为一行),并且如果最后一行以 [=19= 开头,则您可能需要特殊处理](此解决方案将不理会它 - 当然,除非它正上方的行也以 "Title:" 开头)。

这可能适合您 (GNU sed):

sed -Ez 's/((^|\n)Title:) \n\t*//g' file

使用 -z 选项将文件拖入内存。

允许使用 -E 选项扩展正则表达式。

如果第一行或任何后续行以 Title: 开头,后跟换行符和零个或多个制表符,请删除 space 后跟换行符后跟零个或多个制表符的三重奏。

这可能会将文件减少到进一步匹配的状态,因此可能需要循环:

sed -Ez ':a;s/((^|\n)Title:) \n\t*//g;ta' file