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>
我写了一个这样的狂欢:
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" />
首先,我怎么能说删除第二个"
后的所有东西?
其次,我怎么能说提取" "
之间的一切?
我喜欢和sed
或awk
一起做
提前谢谢你
试试这个:
awk -F'"' '/<user=/{ print $2 }' file
仅使用 sed:
$ sed 's/^<user=(.*").*/1/' test.xml # With quotes
$ sed 's/^<user="(.*)".*/1/' test.xml # Without quotes
试试这个cut
,
cut -d'"' -f 2 test.xml
试试这个sed
,
带引号( "
):
sed 's/^.*("[^"]+").*/1/g' test.xml
不带引号( "
):
sed 's/^.*"([^"]+)".*/1/g' test.xml
更新:
sed -e '/^<user/!{d}' -e '/^<user/s/^.*"([^"]+)".*/1/' test.xml
如果你想摆脱管道中的sed
和cut
,有很多方法可以做到这一点,这取决于极端情况是什么。 对我来说最简单的似乎是
awk -F'"' '/<user=/ { print ""$2"" }' test.xml
像往常一样,这是强制性的不要使用正则表达式链接解析 XML。
稍微有趣的极端情况是,如果字符串中可以有引号双引号(但通常XML会使用实体代替),或者元素可以有多个属性。 如果一行上可能有多个<user=...>
元素,这将很快变得比正确的解决方案(即使用 XSLT)更复杂。
尝试:
$ 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
使用 gnu grep
grep -Po 'user=K"[^"]*"' file