删除sed中的重复和控制字符

时间:2011-09-09 23:56:53

标签: regex linux unix sed text-editor

假设我在一行处有一个单词,例如HHEELLLLOO。如何用单个字符替换重复字符。输出应该是HELLO。

也有人知道如何删除或指定sed中的控制字符,例如^ H.

4 个答案:

答案 0 :(得分:4)

问题1

是的,正则表达式可以解决这个问题。在sed:

$ echo HHEELLLLOO | sed 's/\(.\)\1/\1/g'
HELLO

这样就可以了。

问题2

可能因系统而异。在这里(BSD)你可以输入ctrl-v ctrl-h来 插入要由sed解释的文字退格符。试一试。

$ cat file
H^HE^HL^HL^HO^H
$ sed 's/^H//g' file > new_file
$ cat new_file
HELLO

答案 1 :(得分:2)

尝试使用此方法删除重复项:sed 's/\([a-zA-Z]\)\1\+/\1/g'但它会产生'HELO'而不是'HELLO'。请参阅另一个答案,了解原因。

答案 2 :(得分:2)

请参阅限制此网站的重复:http://www.regular-expressions.info/repeat.html

一个真实的脚本,受到chown和该网站的启发:sed's /([a-zA-Z])\ 1 + / \ 1 / g'

然而,你将无法获得HELLO,你只能获得HELO。正则表达式不够复杂,无法确定应该有2个L's。为此,您需要将单词与字典匹配。虽然,你可以使用正则表达式... H + E + L + O +。 。 。

对于控制字符,\ 0xx将匹配任意ASCII字符。你必须查看^ H所代表的内容。

答案 3 :(得分:0)

$ echo BookKeeper | perl -pe 's/(.)\1+/$1/gi'
Bokeper

$ perl -le 'print "\cSome \cEvil \cControl \cMess\c?"' | perl -ple 's/\pC//g'
ome vil ontrol ess

从技术上讲,控制字符为\p{Cc}