sed用单个空格替换所有制表符和空格


23

我得到了如下字符串:

test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

现在我想用一个空格替换记录之间的所有制表符/空格,以便我可以轻松地将其与 cut -d " "

我尝试了以下方法:

sed "s/[\t[:space:]]+/[:space:]/g"

和各种变体,但无法正常工作。有任何想法吗?


试试:sed -r -e“ s / [\ t \] + / / g”
RJS 2012年

您是否cut支持-w选择?
Kondybas 2014年

Answers:


40

使用 sed -e "s/[[:space:]]\+/ /g"

这是一个解释:

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

对于替换,您只想插入一个空格。[:space:]在那儿不起作用,因为这是字符类的缩写,而正则表达式引擎不知道要在其中放置什么字符。

+必须在正则表达式进行转义,因为使用sed的正则表达式引擎+是一个正常的字符,而\+对于“一个或多个”元字符。在“ 掌握正则表达式”的第86页上,杰弗里·弗雷德尔(Jeffrey Friedl)在一个脚注中提到ed和grep使用了转义括号,因为“肯·汤普森(Ken Thompson)认为正则表达式将主要用于C代码,在这种情况下,需要匹配原始括号而不是反向引用。 。” 我认为他对加号有相同的感觉,因此需要将其用作元字符进行转义。这很容易被绊倒。

在sed你需要逃跑+?|(,和)。或使用-r来使用扩展的正则表达式(然后看起来像sed -r -e "s/[[:space:]]\+/ /g"sed -re "s/[[:space:]]\+/ /g"


这也会删除标签吗?您能解释为什么使用\+而不是仅仅使用+吗?
Zulakis 2012年

好的,我明白了。[[:space:]]等于[\ t \ r \ n \ v \ f]。但是,请您解释一下为什么使用\+
Zulakis 2012年

3
[[:space:]]等效于'\ s',因此较短的版本是“ s / \ s \ + / / g”
3molo 2012年

2
基本正则表达式用于表示“一个或多个先前字符或组”时,在加号前使用反斜杠,来源developer.apple.com/library/mac/#documentation/opensource/…
3molo 2012年

啊,我明白了!我不知道有不同的正则表达式版本。谢谢
Zulakis 2012年

6

您可以使用的-s(“挤压”)选项tr

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

[:blank:]字符类既包括空格和制表符。


-2

我喜欢对bash使用以下别名。在其他人写的内容的基础上,使用sed搜索并用单个空格替换多个空格。这有助于从剪切中获得一致的结果。最后,我再次运行了sed来更改选项卡的空间,以便于阅读。

alias ll='ls -lh | sed "s/ \+/ /g" | cut -f5,9 -d" " | sed "s/ /\t/g"'

这如何回答问题?
Tonin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.