regex - sed 中的正则表达式不起作用

标签 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

现在我想删除“;”周围的空白。我必须使用 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'

并得到这个解决方案。它适用于字段结束而不适用于字段开始。

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 继续到下一个字符,它只是一个空格(所以不匹配模式的任何一部分并且不会被替换)。

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

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

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

关于regex - sed 中的正则表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782863/

相关文章:

regex - 正则表达式: extract number in an expression

php - 使否定前瞻不区分大小写

linux - 如何从源代码构建 Linux 'script' 命令

linux - 将 `screen` CLI 命令启动的子进程的输出写入日志文件?

c - C shell 中的输出重定向

javascript - 如何从 Html 页面中去除特定样式?

regex - 如何在 vim 正则表达式中扩展设置或变量?

windows - 驱动程序<->操作系统/应用程序它是如何工作的?一个例子

linux - 在 ubuntu 中使用 gflags 库

node.js - 在使用 grunt-shell 插件时提示输入