Regex/sed-如何匹配一行中72个字符限制之前的最后一个空格字符 我试图编写一个命令,通过在任何相关的行中插入字符72之后的行中断来格式化Git提交消息的文本文件,而不是在单词的中间。如果字符72位于单词的中间,则在字符72之前的行中的最后一个空格处插入断线。以下是: sed -e "s/.\{72\}/&\n/g" < msg.md sed-e“s/\{72\}/&\n/g”
无论单词的边界如何,我都会在位置72处插入,但我不知道如何让它正确地考虑这些边界 它可以用更复杂的bash/python脚本或其他东西来完成,但我很好奇它是否可以完全用regex/sed完成 您可以使用: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
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”之前。对,我对代码做了一点更改。它占用的空间较晚,而不是较早:-(谢谢,它是有效的!你认为你能解释它是如何在每一行上递归地工作的吗?我想了解这一点。我会修改这篇文章以获得更多的解释。)