2014-10-09 42 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