SED发生规格超过9

时间:2014-02-13 18:48:17

标签: shell unix scripting sed truncation

我正在尝试执行操作来截断或重新引入字符串中的特殊字符。所以我决定使用sed进行此操作。但是,在9:

之后,出现规范似乎不起作用

字符串是:

dotLessLogName - / FTTIPIFT1FT751632ADRR262521251T-2521251-01Y20120925_102339csvgz

我的sed命令:

echo "$dotLessLogName" | sed 's/\([/]\{1\}\)\([A-Z]\{2\}\)\([A-Z]\{4\}\)\([A-Z]\{2\}\)\([0-9]\{1\}\)\([A-Z]\{2\}\)\([0-9]\{6\}\)\([A-Z]\{4\}\)\([0-9]\{2\}\)\([0-9]\{7\}\)\([A-Z]\{1\}\)\([-]\{1\}\)\([0-9]\{7\}\)\([-]\{1\}\)\([0-9]\{2\}\)\([A-Z]\{1\}\)\([0-9]\{8\}\)\([_]\{1\}\)\([0-9]\{6\}\)\([a-z]\{3\}\)\([a-z]\{2\}\)/\2,,\3,,\4\5,,\6\7\8\9,,\10,,\11,,\12,,\13,,\14,,\15,,\16,,\17,,\18,,\19,,\20,,\21/'

如您所见,我正在尝试介绍,,(在CSV文件中单独列出字段)

然而输出是:

FT,,TIPI,,FT1,,FT751632ADRR26,,/0,,/1,,/2,,/3,,/4,,/5,,/6,,/7,,/8,,/9,,FT0,,FT1

在前9个实例中似乎工作正常,但在此之后它会变得疯狂!

请帮忙吗?

-Naga

1 个答案:

答案 0 :(得分:0)

GNU sed看起来最多只能管理9个反向引用: [ref]

  

替换可以包含 \ n n 是1到9之间的数字,包括在内)

你有很多你不需要的捕获,因为你只是在替换中连接它们。我将在Perl中执行此操作,m//运算符在列表上下文中将列表作为列表返回:

$ echo "$dotLessLogName" | perl -lne 'print join ",,",  m/\/([A-Z]{2})([A-Z]{4})([A-Z]{2}\d)([A-Z]{2}\d{6}[A-Z]{4}\d{2})(\d{7})([A-Z])(-)(\d{7})(-)(\d{2})([A-Z])(\d{8})(_)(\d{6})([a-z]{3})([a-z]{2})/'
FT,,TIPI,,FT1,,FT751632ADRR26,,2521251,,T,,-,,2521251,,-,,01,,Y,,20120925,,_,,102339,,csv,,gz

您没有包含所需的输出,请确认此输出。