2014-02-17 54 views
-1

UPDATE 這是我的文件:後的具體模式如何刪除線,並提取一些

<department name="/fighters" id="123879" group="channel" case="none" use="no"> 
    <options index_name="index.html" listing="0" sum="no" allowed="no" /> 
    <target prefix="ttp" suffix=".net" /> 
    <type="effort"> 
    <region="20491" readonly="fs1a" readwrite="fs1a" upload="yes" download="yes" repl="yes" hard="0" soft"0" prio="0" write="no" stage="yes" migrate="no" size="0" > 
    <read="content" readwrite="content" hard="215822106624" soft="237296943104" prio="5" write="yes" stage="yes" migrate="no" size="0" /> 
    <overflow name="20491-set-writable" /> 
</replicate> 
<region="20576" readonly="fs1a" readwrite="fs1a" upload="yes" download="yes" repl="yes" hard="0" soft"0" prio="0" write="no" stage="yes" migrate="no" size="0" > 
<read="content" readwrite="content" hard="215822106624" soft="237296943104" prio="5" write="yes" stage="yes" migrate="no" size="0" /> 
<overflow name="20576-set-writable" /> 
</replicate> 
</replication> 
<user="T:106603" /> 
<user="T:123879" /> 
<user="test" /> 
<user="ele::123456" /> 
<user="company-temp" /> 
<user="companymw2" /> 
<user="bird" /> 
<user="coding11" /> 
<user="plazamedia" /> 
<allow go="123456=abcdefghijklmnopqrstuvwxyz" /> 
</department> 

我寫的像一個bash:

awk < test.xml -Fuser= '{ print $2 }' | sed '/^$/d' | cut -d" " -f1 

和結果是一樣的東西:

"T:106603" 
"T:123879" 
"test" 
"ele::123456" 
"company-temp" 
"companymw2" 
"bird" 
"coding11" 
"plazamedia" 

但想象結果是:

"T:106603" /> 
"T:123879" /> 
"test" /> 
"ele::123456" /> 
"company-temp" /> 
"companymw2" /> 
"bird" /> 
"coding11" /> 
"plazamedia" /> 

首先,我該怎麼說刪除第二個以後的東西"

其次,我怎麼能說取出" "之間的一切?

我喜歡跟sedawk

做預先感謝您

+0

這將是有幫助的輸出幾全行最優化的答案。 –

+0

@ Ben Whaley我更新了它 – MLSC

+0

@MortezaLSC,發佈了'test.xml'的示例數據以及您期望的輸出是什麼? – sat

回答

2

試試這個:

awk -F'"' '/<user=/{ print $2 }' file 
+0

它的工作非常出色...那就是我想要 – MLSC

+0

任何解決方案與'sed'? – MLSC

+3

@MortezaLSC您可以使用'sed',但在這種情況下,它會更復雜反向引用和難以理解的比較這個簡單的'awk' – Jotne

1

試試這個cut

cut -d'"' -f 2 test.xml 

試試這個sed

加上引號("):

sed 's/^.*\("[^"]\+"\).*/\1/g' test.xml 

不帶引號("):

sed 's/^.*"\([^"]\+\)".*/\1/g' test.xml 

UPDATE:

sed -e '/^<user/!{d}' -e '/^<user/s/^.*"\([^"]\+\)".*/\1/' test.xml 
+0

我有大文件..如何繼續awk MLSC

+0

現在我想我的問題更清楚 – MLSC

+1

@MortezaLSC ,請參閱更新 – sat

1

如果你想擺脫在管道內sedcut,有很多方法可以做到這取決於角落的情況。最簡單的我,似乎是

awk -F'"' '/<user=/ { print "\"$2\"" }' test.xml 

像往常一樣,這裏的強制性don't parse XML with regex鏈接。

如果可以在字符串中引用雙引號(但通常XML會使用實體來代替)或者元素可以具有多個屬性,那麼稍微有趣的角落案例將會是。如果在一條線上可能有多個<user=...>元素,這將比合適的解決方案快得多,這是use XSLT的解決方案。

1

只使用sed的:

$ sed 's/^<user=\(.*"\).*/\1/' test.xml # With quotes 
$ sed 's/^<user="\(.*\)".*/\1/' test.xml # Without quotes 
+0

應該是'sed -n' s/^ BMW

1

嘗試:

$ awk '/<user=/ && gsub(/<user=|\/>/,x)' file 
"T:106603" 
"T:123879" 
"test" 
"ele::123456" 
"company-temp" 
"companymw2" 
"bird" 
"coding11" 
"plazamedia" 

如果你想試試這個Solaris/SunOS系統上,改變awk/usr/xpg4/bin/awk/usr/xpg6/bin/awk,或nawk

1

使用GNU的grep

grep -Po 'user=\K"[^"]*"' file