我有一个文件名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但是无法获得
答案 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)
作为awk
和grep
解决方案的替代方案。
sed -rn 's|.*"([^"]*)"/>|\1|p' xml | pr -2ats/