使用sed删除_和 - 字符

时间:2015-06-04 22:34:30

标签: linux bash shell sed sh

我正在尝试使用sed将__construct转换为2015-06-03_18-05-30

我有这个:

20150603180530

这些都不起作用。为什么交替不起作用?

5 个答案:

答案 0 :(得分:4)

只要您的脚本有#!/bin/bash(或ksh或zsh)shebang,请不要使用sed tr:您的shell可以在没有启动任何外部工具的(相对较大的)开销的情况下执行此操作:

var='2015-06-03_18-05-30'
echo "${var//[-_]/}"

也就是说,如果确实想要使用sed,那么GNU扩展-r将启用ERE语法:

$ sed -r -e 's/-|_//g' <<<'2015-06-03_18-05-30'
20150603180530

有关BRE(sed的默认值)与ERE之间差异的讨论,请参阅http://www.regular-expressions.info/posix.html。该页面在讨论ERE扩展时指出:

  

通过通常的竖线|支持轮换。

如果你想在POSIX平台上工作 - 使用/bin/sh而不是bash,而没有GNU扩展 - 那么重新构造你的正则表达式以使用一个字符类(并且,为了避免platform-dependent compatibility issues with echo [1] ,改为使用printf

printf '%s\n' "$var" | sed 's/[-_]//g'

[1] - 请参阅该链接的“申请使用”部分。

答案 1 :(得分:2)

这样的事应该做​​。

sed 's/[-_]//g'

这读作:

  1. s:搜索
  2. /[-_]/:适用于匹配-_
  3. 的任何单个字符
  4. //:将其替换为
  5. g:为行中的每个字符执行此操作
  6. 默认情况下,Sed会在每一行上运行,因此这将涵盖文件/字符串中的每个实例。

答案 2 :(得分:1)

我知道您使用sed要求解决方案,但我在tr中提供了替代方案:

$ var='2015-06-03_18-05-30'
$ echo $var | tr -d '_-'
20150603180530

tr应该快一点。

说明:

  • tr代表翻译,可用于将某些字符替换为其他字符。
  • -d选项代表 delete ,它会删除指定的字符而不是替换它们。
  • '_-'指定要删除的字符集(也可以指定为'\-_',但您需要在-转义,因为它被认为是另一个选项。

答案 3 :(得分:0)

简单:

sed 's/[-_]//g' 

字符类[-_]匹配集合中的字符。

答案 4 :(得分:0)

sed 's/[^[:digit:]]//g' YourFile

你能否告诉我echo $var | sed 's/\-\|\_//g'失败的原因,它可以在这里工作(即使不需要退出-_并假设您使用{{1}的GNU sed只能在这个增强版的sed中使用)