字符串中的SED空格删除

时间:2010-05-14 20:06:30

标签: regex sed whitespace

我正在尝试使用sed替换字符串中的空格。例如,给定以下行:

var test = 'Some test text here.';

我想得到:

var test = 'Sometesttexthere.';

我已尝试使用(\x27匹配'):

sed 's|\x27\([^\x27[:space:]]*\)[[:space:]]|\x27\1|g

但这只是给出了

var test = 'Sometest text here.';

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是一个复杂得多的sed脚本,但它没有循环。你知道,只是为了变化:

sed 'h;s/[^\x27]*\x27\(.*\)/\n\x27\1/;s/ //g;x;s/\([^\x27]*\).*/\1/;G;s/\n//g'

它制作一个字符串的副本,在第一个单引号中丢弃一个(将成为下半部分)丢弃前半部分,替换后半部分中的所有空格,交换副本,拆分另一个丢弃下半部分,将它们合并在一起并删除用于拆分的换行符和G命令添加的换行符。

修改

为了选择要操作的特定行,您可以使用一些选择标准。在这里,我已经指定该行必须包含一个等号和至少两个单引号:

sed '/.*=.*\x27.*\x27.*/ {h;s/[^\x27]*\x27\(.*\)/\n\x27\1/;s/ //g;x;s/\([^\x27]*\).*/\1/;G;s/\n//g}'

您可以使用正确的正则表达式,根据您的需要包含和排除。

答案 1 :(得分:0)

您的命令行有两个问题:

  • 首先,\之后缺少[^

  • 其次,即使您使用g修饰符,也只会删除第一个空格。为什么?因为该修饰符导致在同一行中替换连续匹配。它从头开始重新扫描整行。但这是必需的,因为您的匹配锚定在字符串文字的初始'

解决此问题的一个明显方法是使用一个循环,通过条件跳转实现(使用tLabel跳转到:Label; t跳转,如果至少有一个{{1}自上次测试以来与s)匹配。

对于sed脚本来说这是最简单的(并且您不必转义t),如下所示:

'

但是可以在命令提示符下完成。确切的语法可能取决于你的sed风格,对于我的(在Windows上超级sed)它被调用如下:

:a
s|'\([^'[:space:]]*\)[[:space:]]|'\1|
ta

您需要两个单独的脚本表达式,因为标签sed -e ":a" -e "s|\x27\([^\x27[:space:]]*\)[[:space:]]|\x27\1|;ta" 会延伸到表达式的末尾。