【问题标题】:regular expression in sed don't worksed 中的正则表达式不起作用
【发布时间】:2015-11-18 14:38:20
【问题描述】:

我有一个这样的示例文件

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。

最终解决方案

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

我使用了这个语句,这适用于“;”。

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

但我第一次尝试这种方式

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

并得到这个解决方案。它适用于 field-end 而不是 field-begin。

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 语句是错误的还是无法使用“|”进行 sed正则表达式?

【问题讨论】:

  • 如果你说sed -re 's/( ;|; )/;/g' file,它会寻找第一个模式。我认为问题在于这两种模式有一个交集,所以它要么抓住一个,要么抓住另一个
  • 我试过了 sed -re 's/( ;)|(; )/;/g' 等等 sed -re 's/( ;)|; )/;/g' 但两种方式都行不通。
  • 我的问题是,有效 -r - 正则表达式的选项正确

标签: regex linux shell sed data-manipulation


【解决方案1】:

问题是分号后面的空格匹配( ;模式的第一部分,然后sed继续到下一个字符,它只是一个空格(所以不匹配模式的任何一部分并且不会被替换)。

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

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

这会一次性消耗两个可选空间。

【讨论】:

    【解决方案2】:

    一旦你匹配了 ;,解析器就已经消耗了;,并且不会使用它来匹配

    【讨论】:

      猜你喜欢
      • 2015-12-18
      • 2012-12-18
      • 2014-09-03
      • 1970-01-01
      • 2020-01-25
      • 2018-08-22
      • 2020-07-08
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多