摆脱两个;仅当字符包含空格时才使用sed

时间:2015-04-11 00:30:55

标签: regex bash sed osx-yosemite

我有一个包含大量;个字符的文件,可用作分隔符/分隔符。在某些地方,它们是多余的。有一些字符序列的格式为;;;;;; ;等。有没有办法摆脱其中一个分号以及它们之间的内容只有在那里除了空白之外,他们之间什么都没有?

换句话说,我想将text; ; text; text;转换为text; text; text;,只需用一个;替换上面提到的其中一种形式。我想过使用sed,但是如果另一个命令可以完成这项工作,我当然可以使用它。

我正在使用OS X Yosemite。

1 个答案:

答案 0 :(得分:3)

这应该有效:

sed 's/;\( *;\)\{1,\}/;/g'

另一种选择是

sed 's/\(; *\)\{1,\}/; /g'

使用GNU sed,您可以使用\+代替\{1,\}而不是\+。您还可以在BSD sed上使用扩展正则表达式(-E,使用Gnu sed使用-r)以获得更易读的正则表达式:

sed -E 's/;( *;)+/;/g'
sed -E 's/(; *)+/;/g'

两种形式之间的区别在于第二种形式总是确保分号后面有空格。 (在系列的第一个分号之前都没有修复空格。如果那是你想要的,可以在模式的开头加一个*。)