如何删除特定模式之后的行并提取某些内容



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" />

首先,我怎么能说删除第二个"后的所有东西?

其次,我怎么能说提取" "之间的一切?

我喜欢和sedawk一起做

提前谢谢你

试试这个:

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

如果你想摆脱管道中的sedcut,有很多方法可以做到这一点,这取决于极端情况是什么。 对我来说最简单的似乎是

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/awknawk

使用 gnu grep

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

相关内容

  • 没有找到相关文章

最新更新