仅删除第一行换行符
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:/}'
详情
/^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
我有很多文件想要删除特定的换行符。该行始终以 "Title:" 开头,因此我尝试了以下命令:
find . -type f -exec sed -i 's/^Title: \n\t*/Title:/g' {} \;
但据我了解,sed
一次只能处理一行,因此上述方法不起作用。有没有办法删除换行符(在多个文件中),但前提是该行以某个字符串开头?
使用 GNU sed
,您可以使用
sed '/^Title: $/{N;s/.*\n\t*\(.*\)/Title:/}'
详情
/^Title: $/
- 查找内容等于Title:
的行
{N;s/.*\n\t*\(.*\)/Title:/}
- 找到上述行后执行的块:N
- 获取下一行并将换行符和该行附加到模式 spaces/.*\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