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

bal*_*teo 6 regex sed

我正在尝试删除第一次出现的 digit(s)、点、第二次出现的 digit(s)和单词之前的空格

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

sed 's/^[0-9]\+.[0-9]\+\s//' input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)

文本示例:

2.14 Italien
2.15 Japonais
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以帮忙吗?

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

3.15 Chichewa
3.16 Chimane
3.17 Cinghalais
3.18 Créole de Guinée-Bissau
Run Code Online (Sandbox Code Playgroud)

slh*_*hck 12

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

  • 如果您尝试使用支持元字符的扩展正则表达式,则+需要明确启用它们。对于BSDsed你这样做有sed -E,和GNUsedsed -r

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

  • 您正在使用类似 Perl 的\s,它在基本和扩展正则表达式中都不存在。但是,Regularsed不支持 Perl 正则表达式。GNUsed确实支持\s- 但简单地将空格添加到正则表达式会更便携。

  • 最后,您.匹配一个字符,因此您的正则表达式甚至可以匹配该位置的任何字符,而不仅仅是一个点。使用\.正确逃避它。

因此,对于 GNU 来说,解决方案是sed

$ echo "2.12 blah" | sed -r 's/^[0-9]+\.[0-9]+ //'
blah
Run Code Online (Sandbox Code Playgroud)

或者对于 BSD sed

$ echo "2.12 blah" | sed -E 's/^[0-9]+\.[0-9]+ //'
blah
Run Code Online (Sandbox Code Playgroud)

这样你就不需要为不同版本的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
Run Code Online (Sandbox Code Playgroud)

如果真正的问题是您想获取以空格分隔的文件的第二列,那么您就走错了路。要么使用awk,就像@Srdjan Grubor 所说的那样,要么使用cut

$ echo "2.12 foo bar baz" | cut -d' ' -f2-
foo bar baz
Run Code Online (Sandbox Code Playgroud)

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


小智 7

为什么不使用awk?

cat  input.txt | awk '{print $2}' > output.txt
Run Code Online (Sandbox Code Playgroud)