SED命令删除字符串末尾的单词

时间:2015-08-21 18:58:21

标签: sed

我想删除文件中字符串中的最后2个单词。

我首先使用此命令删除最后一个单词。但我无法做到。有人可以帮助我

sed 's/\w*$//' <file name>

我的字符串就像这样

输入:

asbc/jahsf/jhdsflk/jsfh/     -0.001 (exam)

我想删除数值和括号中的数值。

输出:

asbc/jahsf/jhdsflk/jsfh/     

3 个答案:

答案 0 :(得分:2)

使用GNU sed:

$ sed -r 's/([[:space:]]+[-+.()[:alnum:]]+){2}$//' file
asbc/jahsf/jhdsflk/jsfh/

如何运作

  • [[:space:]]+匹配一个或多个空格。

  • [-+.()[:alnum:]]+匹配&#39;字&#39;允许包含任意数量的加号或减号,句号,parens或任何字母数字字符。

    请注意,当句点位于方括号[.]内时,它只是一个句点,而不是通配符:它不需要转义。

  • ([[:space:]]+[-+.()[:alnum:]]+)匹配一个或多个空格后跟一个单词。

  • ([[:space:]]+[-+.()[:alnum:]]+){2}$匹配两个单词及其前面的空格。

请注意使用[:space:][:alnum:]等字符类。与像[a-zA-Z0-9]这样的老式类不同,这些类是unicode安全的。

OSX(BSD)sed

以上是在GNU sed上测试的。对于BSD sed,请尝试:

sed -E 's/([[:space:]][[:space:]]*[-+.()[:alnum:][:alnum:]]*){2}$//' file

删除带小数位数的数字后面的所有内容

这会查找带有可选符号的十进制数字并删除它,它前面的空格以及它后面的所有内容:

$ sed -r 's/[[:space:]]+[-+]?[[:digit:]]+[.][[:digit:]]+[[:space:]].*//' file
asbc/jahsf/jhdsflk/jsfh/

工作原理:

  • [[:space:]]+匹配一个或多个空格

  • [-+]?匹配零个或一个符号。

  • [[:digit:]]+匹配任意位数。

  • [.]匹配小数点(句点)。

  • [[:digit:]]+匹配小数点后的一个或多个数字。

  • [[:space:]]匹配该号码后的空格。

  • .*匹配以下内容。

答案 1 :(得分:1)

看起来你想要保留的内容和你想要删除的内容之间有一个标签。我没有在我面前使用linux,但试试这个。

sed 's/\t.*//'

这假设你的字符串总是类似地格式化,这是我从你的评论中得到的。

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -r 's/\s+\S+\s+\S+\s*$//' file

或者如果您愿意:

sed -r 's/(\s+\S+){2}\s*$//' file

匹配并删除:一个或多个空格,后跟一个或多个非空格两次,后跟行尾的零个或多个空格。