Regex/sed-如何匹配一行中72个字符限制之前的最后一个空格字符 我试图编写一个命令,通过在任何相关的行中插入字符72之后的行中断来格式化Git提交消息的文本文件,而不是在单词的中间。如果字符72位于单词的中间,则在字符72之前的行中的最后一个空格处插入断线。以下是: sed -e "s/.\{72\}/&\n/g" < msg.md sed-e“s/\{72\}/&\n/g”

Regex/sed-如何匹配一行中72个字符限制之前的最后一个空格字符 我试图编写一个命令,通过在任何相关的行中插入字符72之后的行中断来格式化Git提交消息的文本文件,而不是在单词的中间。如果字符72位于单词的中间,则在字符72之前的行中的最后一个空格处插入断线。以下是: sed -e "s/.\{72\}/&\n/g" < msg.md sed-e“s/\{72\}/&\n/g”,regex,git,sed,git-commit,Regex,Git,Sed,Git Commit,无论单词的边界如何,我都会在位置72处插入,但我不知道如何让它正确地考虑这些边界 它可以用更复杂的bash/python脚本或其他东西来完成,但我很好奇它是否可以完全用regex/sed完成 您可以使用: sed 's/.\{72\}[^[:blank:]]*[[:blank:]]*/&\n/g' msg.md [^[:blank:][]*将在72个字符后匹配0个或多个非空格,后跟为零个或多个空格的[:blank:][]* sed 'y/ /³/ s/.*/\ &³/ :sp

无论单词的边界如何,我都会在位置72处插入,但我不知道如何让它正确地考虑这些边界

它可以用更复杂的bash/python脚本或其他东西来完成,但我很好奇它是否可以完全用regex/sed完成

您可以使用:

sed 's/.\{72\}[^[:blank:]]*[[:blank:]]*/&\n/g' msg.md
[^[:blank:][]*
将在72个字符后匹配0个或多个非空格,后跟为零个或多个空格的
[:blank:][]*

sed 'y/ /³/
 s/.*/\
&³/
:space
 s/\(.*\n\)\([^³]\{0,72\}\)³/\1\2 /
 t space
 s/\(.*\) \([^³]*³\)/\1\
\2/
 t space
 s/.\(.*\)./\1/
 ' YourFile
  • posix版本so
    ——GNU上的posix
  • 假设内部没有³,如果有:使用另一个分隔符或先将其翻译,然后在末尾返回
  • 对每个部分进行递归传递,直到不再有“最大值,但少于72个字符的单词后跟一个空格”
解释:

  • 通过将每个空格替换为非空格字符(
    ³
    here)+添加起始新行和尾随
    ³
  • 选择任何标题,然后是新行(通常是最后一行,sed占可用的最大部分),然后是最大字符E(直到72),该字符不是
    ³
    ,后面是
    ³
    ,并用空格字符替换,但最后一行除外(事实上,我使用了2组,但1组就足够了,这与之前的测试不同)
  • 如果有替换,请重试新发生的情况(使其在“最终”空间之前达到最大可用空间),如果不继续
  • 取一个标题(全字符串[而非当前子字符串]开头的所有字符),后跟一个空格(因此当前字符串状态中最后一个可用),后跟一组非
    ³
    ³
    ,并将其替换为第一组,空格替换为新行,而不是第二组
  • 如果有替换,请重试整个循环
  • 删除在开始处添加的额外部分(第一个字符[新行],最后一个字符)

对每一行执行相同的操作,逐行执行sed

感谢您的回复。不过,不要认为这正是我所需要的。如果msg.md中的一行是这样的:“…更改用户类以执行登录验证”字符72是'validation'的'l',我希望命令在'validation'开始之前插入换行符,这将在字符69处,以确保所有行<72个字符,但保留单词边界。我建议保持简单。这将在
验证后插入换行符,因此有时您可能比n 72,直到一个空格匹配。是的,即使不理想,它实际上也可以。谢谢。对于包含行“更改用户类以从某些IP执行额外登录验证”的文件,这对您有用吗?这有77个字符,字符72是“确定”的“i”,因此换行符应该在“确定”之前,但当我运行命令时,换行符插入到“ips”之前。对,我对代码做了一点更改。它占用的空间较晚,而不是较早:-(谢谢,它是有效的!你认为你能解释它是如何在每一行上递归地工作的吗?我想了解这一点。我会修改这篇文章以获得更多的解释。)