sed匹配某项匹配的精确8倍

问题描述

我的目标是: sed应该用8次;替换一行,但是当该行有9或7 ..则不应该。 我尝试了以下方法

echo ";asdf;asdfsadf;sdafasdf;asdfsdfasd;;;;" | sed -E 's/((.*;.*){8})/ /p'
echo ";asdf;asdfsadf;sdafasdf;asdfsdfasd;;;;" | sed -E 's/\<(.*;.*){8}\>/ /p'

,但当行中有9个或更多;时,则无效。 感谢您的帮助

解决方法

您可以使用

^([^;]*;){8}[^;]*$

此部分^([^;]*;){8}重复8次,匹配0+次除;以外的任何字符,然后匹配;

此后,它将再次匹配0+次除;以外的所有字符,直到字符串结尾。

部分

  • ^字符串的开头
  • (起始组
    • [^;]*;匹配0+次除;以外的任意字符
  • ){8}关闭小组并重复8次
  • [^;]*匹配0+次除;以外的任意字符
  • $字符串结尾

Regex demo | Bash demo

例如

echo ";asdf;asdfsadf;sdafasdf;asdfsdfasd;;;;" | sed -E 's/^([^;]*;){8}[^;]*$/ /'
,

这应该可以解决问题:

^([^;]*?;[^;]*?){8}$

测试here

echo ";asdf;asdfsadf;sdafasdf;asdfsdfasd;;;;" | sed -E 's/^([^;]*?;[^;]*?){8}$/REPLACEMENT_WORD/gm;t;d'```

具有8个;输出

REPLACEMENT_WORD

echo ";asdf;asdfsadf;sdafasdf;asdfsdfasd;;;;;" | sed -E 's/^([^;]*?;[^;]*?){8}$/REPLACEMENT_WORD/gm;t;d'```

使用9 ;不会输出任何内容。