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

Getting rid of two ; characters only if they contain only blanks, with sed

我有一个包含大量 ; 个字符的文件,这些字符充当 delimiter/separator。在某些地方,它们是多余的。有 ;;;;;; ; 等形式的字符序列。有没有一种方法可以去掉其中一个分号以及它们之间的内容,前提是它们之间除了空格之外什么都没有?

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

我正在使用 OS X Yosemite.

这应该有效:

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'

这两种形式的区别在于,第二种形式总是确保分号后有一个space。 (都没有修复系列中第一个分号之前的 spaces。如果需要,请将 * 添加到模式的开头。)