只删除第一行的换行符

问题描述 投票:0回答:1

我有不少文件想去掉一个特定的换行符。该行总是以 "Title: "开头,所以我尝试了以下命令。

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

但据我所知, sed 一次只处理一行,所以上面的方法行不通。有没有一种方法可以删除换行符(在多个文件中),但只有当该行以某个字符串开始时才可以?

regex sed line-breaks
1个回答
1
投票

用GNU sed,您可以使用

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

在线 sed 演示

详细内容

  • /^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: 和组1里面的值。

0
投票

我会这样做。

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

这将寻找任何以 "标题 "开头的行。它将在输入中附加一个换行符和下一行。然后它将搜索一个新行字符,前面或后面有任意数量(0或更多)的空白字符--意思是空格或制表符--然后它将用一个空格替换整个内容。

这假定 "Title: "行也可能包括其他文本(在同一行),并且应该被保留。这是我对你的问题的理解,从你用文字说的(虽然和你的尝试不一致)。

如果你的输入可能包含两行连续的以 "Title: "开头的文字,你可能需要特殊的处理(这个解决方案将把它们连成一行),如果最后一行以 "Title: "开头,你可能需要特殊的处理(这个解决方案将不去管它--当然,除非它上面的一行也以 "Title: "开头)。


0
投票

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

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

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

允许通过使用 -E 选项。

如果第一行或其后任何一行以 Title: 后面跟着一个换行和零个或更多的制表符,去掉一个空格和一个换行以及零个或更多的制表符的三重奏。

这可能会减少文件进入进一步的匹配状态,所以可能需要一个循环。

sed -Ez ':a;s/((^|\n)Title:) \n\t*/\1/g;ta' file
© www.soinside.com 2019 - 2024. All rights reserved.