在部分行中为上下文替换或替换行。

时间:2014-10-06 21:01:49

标签: unix replace awk sed

我有数百万行看起来像这样。我正在寻找一种方法来使用" TABLENAME"是。 " TABLENAME"每次都可以不同。 " TABLENAME"总是在这一行。基本上我希望将此路径转换为表名。我的想法是寻找第五次出现的" "并用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,因为有时它可能是一个不同的表名,我不知道它可能是哪一个)

TABLENAME

2 个答案:

答案 0 :(得分:1)

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

我刚做了一些假设。如果您提供更多示例,我可以帮助您。 请注意,如果您想要替换就地,可以使用选项--in-place

答案 1 :(得分:0)

不知道我是否完全理解,但请考虑以下输入:

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

(gnu)请求救援:

$ awk -F@ '{ match($7, /"([^"]+)/, arr); print arr[1]}' input.txt
TABLENAME1
TABLENAME2
TABLENAME3
TABLENAME4