仅删除第一个换行符



我有很多文件想要去掉特定的换行符。这行总是以"标题:"开头,所以我尝试了以下命令:

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

但据我所知,sed一次只处理一行,所以上面的内容不起作用。有没有一种方法可以删除换行符(在多个文件中(,但前提是该行以某个字符串开头?

使用GNUsed,您可以使用

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

查看在线sed演示

详细信息

  • /^Title: $/-查找内容等于Title:的行
  • {N;s/.*nt*(.*)/Title:1/}-找到上面的行后执行的块:
    • N-获取下一行并将新行和该行附加到模式空间
    • s/.*nt*(.*)/Title:1/-使用匹配的.*nt*(.*)模式替换模式空间(现在包含两行(
      • .*-任意0+个字符
      • nt*-换行符和0+制表符
      • (.*)-捕获组1:任意0+个字符
      • /Title:1/-替换模式、Title:和组1内的值

我会这样做:

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

这将查找以字符串"标题:"开头的任何一行。它将在输入中附加一行换行符和下一行。然后,它将搜索一个换行符,可以选择在其前面和/或后面有任意数量(零个或更多(的空白字符,意思是空格或制表符,并将整个字符替换为一个空格。

这假设"标题:"行也可能包括其他文本(在同一行(,并且应该保留这些文本。这是我对你的问题的理解,从你的言语中看(但与你的尝试不符(。

如果您的输入可能包含两行以"标题:"开头的连续行(此解决方案将它们合并为一行(,并且最后一行以"名称:"开头,则您可能需要进行特殊处理(当然,除非其正上方的行也以"标题"开头(。

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

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

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

使用-E选项允许使用扩展regexp。

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

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

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

最新更新