在数字对之间替换分隔符

时间:2016-12-15 21:06:15

标签: regex linux string shell sed

我想使用[0-9][0-9]-[0-9][0-9]将所有字​​符串[0-9][0-9]/[0-9][0-9]替换为sed

换句话说,我想将-替换为/

如果我的文字中有某处:

09-36
32-43
54-65

我想要这个改变:

09/36
32/43
54/65

3 个答案:

答案 0 :(得分:3)

使用GNU ods output summary=means_out; proc means data=sashelp.cars mean stackodsoutput; class make; var mpg_city mpg_highway; run; ods output close;

sed
  • $ echo '09-36 32-43 54-65' | sed -r 's|\<([0-9]{2})-([0-9]{2})\>|\1/\2|g' 09/36 32/43 54/65 启用扩展正则表达式,其中:

    • 不需要-r - 转义\字符。
    • 允许使用( ) { }\<仅匹配字边界(如果表达式只匹配整行,请改用/>^,并省略$选项)
  • g用作备用正则表达式分隔符,以便|可以在没有/的情况下使用 - 转义。

BSD / macOS \解决方案看起来会略有不同:
sed

答案 1 :(得分:1)

sed -e 's/\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1\/\2/g' 

可能不是最优雅的版本,但对我有用。在我看来,无数的反斜杠使得这一点变得难以理解。你可以通过而不是来提高可读性,使用/来分离模式和替换可能吗?

答案 2 :(得分:1)

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:"+"phonenumber" ));
startActivity(intent);

输入

perl -C -npe 's/(?<!\d)(\d\d)-(\d\d)(?!\d)/\1\/\2/g' file

输出

维基 1-11 22-33 444-44 55-555 66-66百科
77-77
8 88-88

在上面的命令中

  • 维基 1-11 22/33 444-44 55-555 66/66百科 77/77 8 88/88 启用Unicode;
  • -C使Perl处理每个输入行的脚本;
  • -n使Perl将脚本的结果打印到标准输出;
  • -p接受Perl表达式(特别是,它是替换)。

在这种模式下(-e),Perl就像 sed 一样。该脚本将用-npe分隔的每对数字替换为用斜杠分隔的同一对。

-(?<!\d)是否定的lookaround表达式。

要使用(?!\d)选项编辑文件,请使用-i

如果输入不是文件,您可以通过管道将输入传递给Perl,例如:

perl -C -i.backup -npe ...