我正在尝试使用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.';
有什么想法吗?
答案 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"
会延伸到表达式的末尾。