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

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

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

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

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

答案1

您使用的命令应该可以与 GNU 一起使用sed。但是对于 BSD sed(例如 OS X 自带的),它却不行。

  • 如果你想使用扩展正则表达式– 支持+元字符 – 您需要明确启用它们。对于 BSD,sed您可以使用 执行此操作sed -E,对于 GNU,sed请使用 执行此操作sed -r

    孤独\+当 ERE 未启用时可以使用 GNU sed,但可移植性较差。

  • 您使用的是 Perl-like \s,它不存在于基本正则表达式和扩展正则表达式中。sed不过,正则不支持 Perl 正则表达式。GNUsed支持\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-第二列和所有后续列,因此这基本上将以第一个空格作为分隔符并输出其余部分。

答案2

为什么不使用 awk?

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

答案3

如果只需要删除第一个空格之前的所有内容,那么这就足够了

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

答案4

使用任何 sed:

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

或者这可能就足够了:

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

相关内容