正常表达在sed不工作

时间:2015-11-18 14:38:20

标签: regex linux shell sed data-manipulation

我有这样的样本文件

word1 ; word2 ; word3 ; word4 ; word5 ; word6 ; word7
word1 ; word2 ; word3 ; word4 ; word5 ; word6 ; word7
word1 ; word2 ; word3 ; word4 ; word5 ; word6 ; word7
word1 ; word2 ; word3 ; word4 ; word5 ; word6 ; word7

现在我要删除&#34 ;;"周围的空白。我必须使用sed。

决赛解决方案

word1;word2;word3;word4;word5;word6;word7
word1;word2;word3;word4;word5;word6;word7
word1;word2;word3;word4;word5;word6;word7
word1;word2;word3;word4;word5;word6;word7

我使用了这个声明,这适用于&#34 ;;"。

cat testdata.csv | sed -r 's/ ?; ?/;/g'

但是我第一次尝试这种方式

cat testdata.csv | sed -r 's/( ;|; )/;/g'

并获得此解决方案。它适用于现场结束,而不适用于现场开始。

word1; word2; word3; word4; word5; word6; word7
word1; word2; word3; word4; word5; word6; word7
word1; word2; word3; word4; word5; word6; word7
word1; word2; word3; word4; word5; word6; word7

我的sed声明是错误的还是可以使用" |"正则表达式?

2 个答案:

答案 0 :(得分:3)

问题是分号后跟的空格是匹配模式( ;的第一部分,然后sed继续到下一个字符,这只是一个空格(所以不匹配模式的一部分,并没有被替换。)

一种选择是将正则表达式更改为:

sed 's/ *; */;/g'

这一次消耗两个可选空格。

答案 1 :(得分:2)

 ;匹配后,解析器已使用;,并且不会使用它来匹配