我正在尝试删除第一次出现的 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,和GNUsed用sed -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)
| 归档时间: |
|
| 查看次数: |
10192 次 |
| 最近记录: |