![使用 sed 从字符串中删除数字和空格](https://linux22.com/image/1357860/%E4%BD%BF%E7%94%A8%20sed%20%E4%BB%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E5%88%A0%E9%99%A4%E6%95%B0%E5%AD%97%E5%92%8C%E7%A9%BA%E6%A0%BC.png)
我试图删除第一次出现的数字、点、第二次出现的数字以及单词前的空格。
我想出了这个正则表达式:
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 未启用时可以使用 GNUsed
,但可移植性较差。您使用的是 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