【问题标题】:Remove only first line break仅删除第一个换行符
【发布时间】:2020-04-25 15:41:36
【问题描述】:

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

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

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

【问题讨论】:

  • 以“Title:”开头还是整个行?在您的尝试中,整行完全由“Title:”组成,后跟一个空格,没有别的。请澄清。此外,您没有提到删除标签,但您的尝试在换行符后查找零个或多个标签;那是怎么回事?如果您需要处理这些选项卡,请在文本问题中说明,而不仅仅是在代码中。
  • 还有几个问题:你能有两行以“标题:”开头的连续行吗?整件事中的最后一行可以以“标题:”开头吗?如果是这样,在这两种情况下,所需的处理方式是什么?
  • @mathguy 我简化了上面的正则表达式,使其更易于理解并展示主要思想。这就是为什么我在上面说“开始于”。不,它通常是文件中以“标题”开头的前 10 行之一

标签: regex sed line-breaks


【解决方案1】:

使用 GNU sed,您可以使用

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

online sed demo

详情

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

【讨论】:

  • 缺少-E 标志?我相信捕获组和反向引用需要它。
  • 不,这是一个 POSIX BRE 表达式。
  • 在免费的 BSD sed 中,尝试sed -e '/^Title: $/ {' -e N -e 's/.*\n\t*\(.*\)/Title:\1/' -e '}'
  • 哦,好的,对。我的记忆力下降了——我读过一次 POSIX 标准,我以为我知道什么是 BRE,什么是 ERE,但显然我的记忆中有错误。谢谢!
  • 最后应该没有/,有块。
【解决方案2】:

我会这样做:

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

这将查找以字符串“Title:”开头的任何行。它将在输入中附加一个换行符和下一行。然后它将搜索一个换行符,可选地在前面和/或后面跟任意数量(零个或多个)空白字符 - 表示空格或制表符 - 它会将整个内容替换为一个空格。

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

如果您的输入可能包含以“Title:”开头的两行连续行(此解决方案会将它们合并为一行),并且如果最后一行以“Title:”开头(此解决方案将不理会它 - 当然,除非它正上方的行也以“标题:”开头)。

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      相关资源
      最近更新 更多