我正在尝试使用sed将__construct
转换为2015-06-03_18-05-30
。
我有这个:
20150603180530
这些都不起作用。为什么交替不起作用?
答案 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'
这读作:
s
:搜索/[-_]/
:适用于匹配-
或_
//
:将其替换为g
:为行中的每个字符执行此操作默认情况下,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中使用)