使用sed从字符串中删除数字和空格


6

我试图删除第一次出现的数字,点,数字的第二次出现以及单词之前的空格

我想出了这个正则表达式:

sed 's/^[0-9]\+.[0-9]\+\s//' input.txt > output.txt

文字样本:

2.14 Italien
2.15 Japonais

不幸的是,我的正则表达式不起作用。有一个问题,\s但我无法确定它是什么...

有人可以帮忙吗?

编辑:问题是我需要删除第一个空格只有一些文本包含空格,如下所示:

3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau

你真的只想得到第二列吗?
slhck 2013年

似乎与GNU Sed 4.2.1一样按预期工作。也许将字符类放在“范围”括号中会有帮助吗?例如:[\s]\+此外,点没有转义时具有特殊含义,您可能需要注意这一点。
ЯрославРахматуллин2013年

@ЯрославРахматуллин sed当OP使用ERE元字符(+)时,如何使用纯GNU 调用,默认情况下不启用扩展RE?
slhck 2013年

1
@slhck:这些是GNU扩展。如果你逃脱加号,你不需要-r开关; 并且让它更加混乱,你无法摆脱加号sed -r\s也有效。两者都停止使用--posix开关。
Dennis

不确定/usr/share/doc/sed-4.2.1-r1/NEWS.bz2(Gentoo)文件类型表明 - “标准”行为需要--posix选项,尽管手册确实说-r扩展正则
表达式

Answers:


12

您正在使用的命令应该与GNU一样工作sed。但是对于BSD sed,例如OS X,它不会。

  • 如果您正在尝试使用支持元字符的扩展正则表达式,则+需要明确启用它们。对于BSD,sed你可以使用sed -E和GNU sed一起使用sed -r

    \+单独与GNU sed当ERES未启用,但这种情况较少便携。

  • 您使用的是Perl-like \s,它对于Basic和Extended Regular Expressions都不存在。Regular sed虽然不支持Perl正则表达式。GNU sed确实支持\s- 但只需在正则表达式中添加空间就更容易了。

  • 最后,你.匹配一个字符,所以你的正则表达式甚至可以匹配那个地方的任何字符,而不仅仅是一个点。使用\.正确逃避它。

那么,对于GNU来说,解决方案是sed

$ echo "2.12 blah" | sed -r 's/^[0-9]+\.[0-9]+ //'
blah

或者对于BSD sed

$ echo "2.12 blah" | sed -E 's/^[0-9]+\.[0-9]+ //'
blah

这样,您不需要为不同版本的不同版本使用不同的正则表达式sed。用你的例子:

$ cat test
3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau

$ sed -r 's/^[0-9]+\.[0-9]+ //' test
Chichewa
Chimane
Cinghalais
Créole de Guinée-Bissau

如果真正的问题是你想获得以空格分隔的文件的第二列,那么你就是以错误的方式解决这个问题。要么awk像@Srdjan Grubor那样使用,要么使用cut

$ echo "2.12 foo bar baz" | cut -d' ' -f2-
foo bar baz

所述-f2-指定第二和所有下面的列,所以这将基本上采取第一空间作为分隔符和输出其余部分。


我运行GNU sed并尝试了-r开关如下:sed -r 's/[0-9]+\.[0-9]+ //' input.txt > out.txt无济于事。
balteo 2013年

嗨slhck:感谢您的详细回复。仅供参考,我使用Ubuntu和GNU sed。
balteo 2013年

我已经用GNU测试了所有的例子sed。什么具体不起作用?你得到了什么结果?cut -d' ' -f2-尽管如此,你的例子中最直接的解决方案。
slhck 2013年

1
您输入的格式不是您所说的那样。请更彻底地检查一下:在数字之后,你有一个U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX,然后是a U+00A0 NO-BREAK SPACE,而不仅仅是一个空格。一个sed -r 's/^[0-9]+\.[0-9]+ //' input应该做的,如果你复制什么是你的号码和串入实际的命令之间的空间。
slhck 2013年

1
perl的POSIX-y等价物\s[[:space:]]
格伦杰克曼2013年

7

为什么不用awk?

cat  input.txt | awk '{print $2}' > output.txt

嗨Srdjan:谢谢你的回复。我编辑了我的帖子以进一步说明我的问题。
balteo 2013年

看到我对slhck的评论。抱歉。
balteo 2013年

2

如果唯一的事情是放弃所有内容并包括第一个空格,那么这就足够了

sed -e 's/[^ ]* //'

这可以在没有数字但不在这种情况下工作。
balteo 2013年

使用此:sed -r 's/[^ ]//'在只有前导空格的文件上产生所需的效果。
balteo 2013年

看到我对slhck的评论。抱歉。
balteo 2013年

1

你也可以使用grep:

grep -oP '[a-zA-Z]+$' input.txt > output.txt


1

任何sed:

sed 's/^[0-9]\{1,\}\.[0-9]\{1,\} //' 

或许这可能就足够了:

sed 's/^[0-9.]\{1,\} //' file
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.