grep 值并重新排列文件
grep values and re-arranging the file
嗨,我有一个文件名 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
试过 cut 和 awk 但无法得到
awk
应该可以为您做到这一点:
awk -F'"' 'BEGIN { OFS="/" } =="ProcedureName"{procedureName=} =="PackageName" { print procedureName, }' yourfilename
这将使用双引号作为分隔符。它在位置 2 中测试字符串 "ProcedureName",并将位置 4 存储在变量 procedureName
中。然后,如果它在位置 2 找到 "PackageName",它会打印出存储的 procedureName
和位置 4 的内容。它使用反斜杠作为 OutputFieldSeperator。
从技术上讲,您可以将 grep
传递给它,但是 awk
可以自己进行搜索,这就是我在这里写的内容。
试试这个 awk
:
awk -F'"' 'NR%2{p1=;next} {print p1 "/" }'
测试:
$ awk -F'"' 'NR%2{p1=;next} {print p1 "/" }' file
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234
我的第一次尝试(也是我实际推荐的一次)与@sat 的相同,所以我删除了它,这里有一个不同的方法,以防它在其他情况下有用:
$ awk -F'"' '{n2v[]=} !(NR%2){print n2v["ProcedureName"] "/" n2v["PackageName"] }' file
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234
n2v
表示 name2value
,这是我经常在输入文件中具有名称到值映射的应用程序类型中使用的数组名称。
使用 GNU grep 和粘贴:
grep -oP '"\K[^"]*(?="/)' file | paste -d / - -
输出:
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234
作为 awk
和 grep
解决方案的替代方案。
sed -rn 's|.*"([^"]*)"/>||p' xml | pr -2ats/
这可能对你有用 (GNU sed):
sed 'N;s#.*value="\([^"]*\)".*value="\([^"]*\)".*#/#' file
一次读取两行并提取双引号之间的值,前面是文字 value=
.
另一个略短的版本在 LHS 中使用反向引用和 -r
选项使正则表达式更易于阅读:
sed -r 'N;s#.*(value=")([^"]*)".*([^"]*)".*#/#' file
另一种方式,使用保留 space 和替换:
sed -r 's/.*"(.*)".*//;h;N;s///;H;g;s#\n#/#' file
提取两个连续行中双引号之间的最后一个值,并将结果重新排列为所需的字符串。
嗨,我有一个文件名 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
试过 cut 和 awk 但无法得到
awk
应该可以为您做到这一点:
awk -F'"' 'BEGIN { OFS="/" } =="ProcedureName"{procedureName=} =="PackageName" { print procedureName, }' yourfilename
这将使用双引号作为分隔符。它在位置 2 中测试字符串 "ProcedureName",并将位置 4 存储在变量 procedureName
中。然后,如果它在位置 2 找到 "PackageName",它会打印出存储的 procedureName
和位置 4 的内容。它使用反斜杠作为 OutputFieldSeperator。
从技术上讲,您可以将 grep
传递给它,但是 awk
可以自己进行搜索,这就是我在这里写的内容。
试试这个 awk
:
awk -F'"' 'NR%2{p1=;next} {print p1 "/" }'
测试:
$ awk -F'"' 'NR%2{p1=;next} {print p1 "/" }' file
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234
我的第一次尝试(也是我实际推荐的一次)与@sat 的相同,所以我删除了它,这里有一个不同的方法,以防它在其他情况下有用:
$ awk -F'"' '{n2v[]=} !(NR%2){print n2v["ProcedureName"] "/" n2v["PackageName"] }' file
abc/123abc
bac/bac123
cde/cd123
b4u/b4u234
n2v
表示 name2value
,这是我经常在输入文件中具有名称到值映射的应用程序类型中使用的数组名称。
使用 GNU grep 和粘贴:
grep -oP '"\K[^"]*(?="/)' file | paste -d / - -
输出:
abc/123abc bac/bac123 cde/cd123 b4u/b4u234
作为 awk
和 grep
解决方案的替代方案。
sed -rn 's|.*"([^"]*)"/>||p' xml | pr -2ats/
这可能对你有用 (GNU sed):
sed 'N;s#.*value="\([^"]*\)".*value="\([^"]*\)".*#/#' file
一次读取两行并提取双引号之间的值,前面是文字 value=
.
另一个略短的版本在 LHS 中使用反向引用和 -r
选项使正则表达式更易于阅读:
sed -r 'N;s#.*(value=")([^"]*)".*([^"]*)".*#/#' file
另一种方式,使用保留 space 和替换:
sed -r 's/.*"(.*)".*//;h;N;s///;H;g;s#\n#/#' file
提取两个连续行中双引号之间的最后一个值,并将结果重新排列为所需的字符串。