Regex / sed - 如何匹配72个字符限制之前的行中的最后一个空格字符

时间:2014-11-18 10:16:31

标签: regex git sed git-commit

我尝试编写一个命令,通过在任何相关行中插入字符72之后的换行符,而不是在单词的中间插入格式化git提交消息的文本文件。如果字符72位于单词的中间,则应在字符72之前的行中的最后一个空格处插入换行符。以下内容:

sed -e "s/.\{72\}/&\n/g" < msg.md
不管字边界如何,

都会在72位插入,但我无法想到如何正确地考虑这些边界。

可以使用更复杂的bash / python脚本或某些内容来完成每一行,但我很好奇是否可以完全在regex / sed中完成。

2 个答案:

答案 0 :(得分:1)

您可以使用:

sed 's/.\{72\}[^[:blank:]]*[[:blank:]]*/&\n/g' msg.md

[^[:blank:]]*将匹配72个字符后面的0或更多非空格,后跟[[:blank:]]*,这是0或更多空格。

答案 1 :(得分:1)

sed 'y/ /³/
 s/.*/\
&³/
:space
 s/\(.*\n\)\([^³]\{0,72\}\)³/\1\2 /
 t space
 s/\(.*\) \([^³]*³\)/\1\
\2/
 t space
 s/.\(.*\)./\1/
 ' YourFile
  • posix版本所以--posix在GNU sed上
  • 假设里面没有³,如果有:使用另一个分隔符或者将其翻译为firste,然后返回到最后
  • 递归传递每个部分,直到没有更多“maximmu但少于72个字的字符后跟一个空格”

<强>阐释:

  • 通过用非空格字符替换每个空格来准备用于递归修改的字符串(此处为³)+添加起始新行和尾随³
  • 选择任何标题后跟一个新行(所以通常是最后一个新行,sed采用最大可用部分),然后是最大特征(直到72),不是³后跟{{1}除了最后³之外用空格char替换它(事实上,我使用2组但是1就足够了,它可以保留早期测试)
  • 如果有替换,请重新尝试新的出现(因此在“最终”空格之前达到最大值),如果没有,则继续
  • 取一个标题(所有字符串从完整字符串[不是当前子字符串]开始)后跟一个空格(所以当前字符串状态中的最后一个可用)后跟一组非³和一个³并将其替换为第一组,空格替换为第二组
  • 如果有替换,请重试整个周期
  • 删除在开头添加的额外部分(第一个字符[新行],最后一个字符)

对每一行做同样的事情,逐行采取行动