我有不少文件想去掉一个特定的换行符。该行总是以 "Title: "开头,所以我尝试了以下命令。
find . -type f -exec sed -i 's/^Title: \n\t*/Title:/g' {} \;
但据我所知, sed
一次只处理一行,所以上面的方法行不通。有没有一种方法可以删除换行符(在多个文件中),但只有当该行以某个字符串开始时才可以?
用GNU sed
,您可以使用
sed '/^Title: $/{N;s/.*\n\t*\(.*\)/Title:\1/}'
详细内容
/^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里面的值。我会这样做。
sed '/^Title:/{N;s/[[:blank:]]*\n[[:blank:]]*/ /}'
这将寻找任何以 "标题 "开头的行。它将在输入中附加一个换行符和下一行。然后它将搜索一个新行字符,前面或后面有任意数量(0或更多)的空白字符--意思是空格或制表符--然后它将用一个空格替换整个内容。
这假定 "Title: "行也可能包括其他文本(在同一行),并且应该被保留。这是我对你的问题的理解,从你用文字说的(虽然和你的尝试不一致)。
如果你的输入可能包含两行连续的以 "Title: "开头的文字,你可能需要特殊的处理(这个解决方案将把它们连成一行),如果最后一行以 "Title: "开头,你可能需要特殊的处理(这个解决方案将不去管它--当然,除非它上面的一行也以 "Title: "开头)。
这可能对你有用(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