2014-10-09 73 views
0

我有几百万行,看起来像这样。我正在寻找一种用“TABLENAME”替换这些行的方法。 “TABLENAME”每次都会有所不同。 “TABLENAME”总是在这一行。基本上我正在寻找将此路径转换为“TABLENAME”。我的想法是寻找第五次出现的“”,并用sed替换它的整个行。 sed有这个能力吗?先谢谢你。Sed一行并将其替换为行中的内容

我行

path : /BLAH/BLAH1[(@name="BLAH2")]/BLAH/BLAH[(@BLAH="SERVER")]/BLAH[(@name="CHECK")]/sampler[(@name="SAMPLE")][(@type="")]/table[(@name="TABLENAME")]/rows/row[(@name="AROW")]/cell[(@column="ACELL")] 

我想要的结果(轮到我行正下方的线)(我不能用sed替换路径表名,因为有时它可能是一个不同的表名,我不知道哪一个可能是)

TABLENAME 

本来我可以用

sed -r "s/.*table\[\(@name=\"([A-Z]+).*/\1/" myfile 

做到这一点为s由另一个stackoverflower使用,但它看起来不起作用,因为路径之前有额外的8个空格。如果我删除了8个空格,这个代码就可以工作,但是由于我用java调用这个空间的方式,这些空间总是会在那里。有没有解决这个命令的工作?

+1

前面的空格不应该是你的问题,因为它们会被模式中的第一个*所贪婪地匹配。所以这个正则表达式应该按照预期工作。 – toddlermenot 2014-10-09 18:26:20

+0

表名可以包含小写字母,数字,下划线,任何其他特殊字符?你的正则表达式只是假设大写字母;也许'[^“] +'会更好地为您服务 – 2014-10-09 18:57:08

回答

0

如果表[(@名称= “TABLENAME”)]将仅出现在每行一次,可以使用:

sed 's/\(.*\)table/table/g' | cut -d ")" -f 1 | cut -d "=" -f 2 

输出:

[email protected]:~/AMD$ echo "/BLAH/BLAH1[(@name="BLAH2")]/BLAH/BLAH[(@BLAH="SERVER")]/BLAH[(@name="CHECK")]/sampler[(@name="SAMPLE")][(@type="")]/table[(@name="TABLENAME")]/rows/row[(@name="AROW")]/cell[(@column="ACELL")]" | sed 's/\(.*\)table/table/g' | cut -d ")" -f 1 | cut -d "=" -f 2 
TABLENAME 
[email protected]:~/AMD$ 

在我是示例只是回应字符串和处理。如果从文件(即文件中的字符串)处理,输出将是“TABLENAME”。

sed 's/\(.*\)table/table/g' | cut -d ")" -f 1 | cut -d "=" -f 2 | sed 's/"//g' 
+0

按照预期工作,真正创造性地快速解决我的问题。 – LinA 2014-10-10 15:20:41