我使用此命令来获取输出,但我想修剪输出以查看精简的最终结果
所需结果:
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
命令:
grep --color -H -r "__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions" /opt/tibco/product/tra/domain/WFM-DEV 2>/dev/null
我当前看到的输出:
/opt/tibco/product/tra/domain/WFM-DEV/data/EsbDwMarkDownAdbSub.dat: <instanceInfoPropertyname="__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions/CleClient" value="3.1"/>
/opt/tibco/product/tra/domain/WFM-DEV/data/EsbDwMarkDownAdbSub.dat: <instanceInfoProperty name="__GLOBAL_SUBSTITUTION_VARIABLE__Environment/LibraryVersions/Encrypter" value="1.0"/>
答案1
例如,您可以将结果导入sed
(也许我们可以在知道您的实际输入的情况下为您提供更优雅的方式) - 将其添加到命令末尾grep
:
| sed -r 's#.*/(EsbDw[^\.]+).*/([^"]+").*=([^/]+)/>#\1 "\2 \3#'
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
-r
使用 ERE,这样我们就不必()
逃避+
s#old#new#
old
用。。。来代替new
.*/
之前的任何字符/
(EsbDw[^\.]+)
EsbDw
找到以a 开头和结尾的模式.
,并保存在 a 之前的所有内容.
/([^"]+")
/
和之间的任何字符-包括"
后保存所有内容/
"
=([^/]+)/>
保存介于=
两者之间的一切/>
\1 "\2 \3
三个已保存的模式之间有空格(并添加一个"
)
答案2
使用 Python2 可以相当轻松地实现所需的输出:
$ ./trim_lines.py < input.txt
EsbDwMarkDownAdbSub "CleClient" "3.1"
EsbDwMarkDownAdbSub "Encrypter" "1.0"
脚本内容trim_lines.py
:
#!/usr/bin/env python
import sys,os,re
for line in sys.stdin:
words=line.strip().split()
val1 = os.path.basename(words[0]).split(".")[0]
val2 = '"' + os.path.basename(words[2])
val3 = re.split("[=/]",words[-1])[1]
print val1,val2,val3
这里发生的事情相当简单。我们使用<
将输入文件的内容重定向到脚本(在您的例子中,来自 grep 的输入使用管道...| ./trim_lines.py
将输出发送grep
到脚本)。脚本循环遍历进入其 stdin 流的所有行,将每行拆分为单词,并使用一些内置模块(例如os.path
和)额外过滤这些单词re
。我们获得的前两个值使用os.path.basename()
,最后一个值用于re.split()
在多个分隔符处分解最后一个字符串。这里发生了很多事情,但相信我 - 它非常简单。