grep值并重新排列文件

时间:2015-09-22 20:30:22

标签: shell awk sed grep cut

我有一个文件名test.txt

    (standard input):8:      <property name="ProcedureName" value="abc"/>
(standard input):7:         <property name="PackageName" value="123abc"/>
(standard input):8:         <property name="ProcedureName" value="bac"/>
(standard input):7:      <property name="PackageName" value="bac123"/>
(standard input):8:      <property name="ProcedureName" value="cde"/>
(standard input):7:      <property name="PackageName" value="cd123"/>
(standard input):8:      <property name="ProcedureName" value="b4u"/>
(standard input):7:      <property name="PackageName" value="b4u234"/>

我必须只使用以下格式从此文件中grep packagename和procdeurename的值:进入o / p文件

abc/123abc
bac/bac123
cde/cd123
b4u/b4u234

尝试切割和awk但是无法获得

5 个答案:

答案 0 :(得分:5)

试试这个awk

awk -F'"' 'NR%2{p1=$4;next} {print p1 "/" $4}' 

<强>测试

$ awk -F'"' 'NR%2{p1=$4;next} {print p1 "/" $4}' file
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234

答案 1 :(得分:2)

使用GNU grep和paste:

AdlibRegister("refresh", 180000) ; for 3 minutes

输出:

abc/123abc
bac/bac123
cde/cd123
b4u/b4u234

答案 2 :(得分:1)

awk应该可以为您完成此操作:

awk -F'"' 'BEGIN { OFS="/" } $2=="ProcedureName"{procedureName=$4} $2=="PackageName" { print procedureName,$4 }' yourfilename

这将使用双引号作为分隔符。它测试字符串&#34; ProcedureName&#34;在位置2并将位置4存储在变量procedureName中。然后,如果它找到&#34; PackageName&#34;在位置2,它打印出存储的procedureName和位置4的东西。它使用反斜杠作为OutputFieldSeperator。

从技术上讲,你可以将grep发送到此,但awk可以自行进行搜索,这就是我在这里写的内容。

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed 'N;s#.*value="\([^"]*\)".*value="\([^"]*\)".*#\1/\2#' file

一次读取两行,并在文字value=之前的双引号之间提取值。

使用LHS中的反向引用和-r选项的另一个略短的版本,使正则表达式更易于阅读:

sed -r 'N;s#.*(value=")([^"]*)".*\1([^"]*)".*#\2/\3#' file

另一种方式,使用保留空间和替换:

sed -r 's/.*"(.*)".*/\1/;h;N;s//\1/;H;g;s#\n#/#' file

在两个连续的行中提取双引号之间的最后一个值,并将结果重新排列为所需的字符串。

答案 4 :(得分:0)

作为awkgrep解决方案的替代方案。

sed -rn 's|.*"([^"]*)"/>|\1|p' xml | pr -2ats/