我正在尝试从文本中删除空格,例如:
Ala ma kota ,psa i kanarka
, chyba . . .
为了得到
Ala ma kota,psa i kanarka, chyba...
我正在尝试使用sed
命令:
echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed 's/ ,/,/g' | sed 's/ ././g'
它可以工作,,
但对于点或新线仍然存在问题。它取代两者.
,而不是同时取代两者。
(我使用的是 Linux。)
答案1
使用 GNU sed(您拥有它是因为您标记了此 Linux):
$ echo $'Ala ma kota ,psa i kanarka\n, chyba . . .' | sed -zE 's/[[:space:]]([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...
怎么运行的
-z
这告诉 sed 一次读入所有文本,而不是一次读一行。
-E
这告诉 sed 使用扩展的正则表达式语法。这消除了一些难看的反斜杠的需要。
s/[[:space:]]([,.?!])/\1/g
,
这将替换、.
、?
或之一后的任何空格!
,仅使用标点符号。如果您想包含其他标点符号,只需将它们添加到带有 的方括号之间
,.?!
。[[:space:]]
不仅包括空格,还包括制表符和换行符等。
变化
这个版本有一个或者更多标点符号之前的空白字符:
$ echo $'Ala ma kota ,psa i kanarka \n, chyba . . .' | sed -zE 's/[[:space:]]+([,.?!])/\1/g'
Ala ma kota,psa i kanarka, chyba...
讨论
问题中,有:
s/ ././g
请注意,在正则表达式中,.
是通配符:它匹配任何内容。因此,.
匹配一个空白,后跟任何特点。这两个字符被替换为.
(因为替换边是不是正则表达式,.
是字面句号)。这不是你所希望的。