我有一个文件 abc.txt 内容是
<classpathentry kind="src" path="Sources"/>
<classpathentry kind="con" path="WOFramework/ERExtensions"/>
<classpathentry kind="con" path="WOFramework/ERJars"/>
<classpathentry kind="con" path="WOFramework/ERPrototypes"/>
<classpathentry kind="con" path="WOFramework/JavaEOAccess"/>
<classpathentry kind="con" path="WOFramework/JavaEOControl"/>
<classpathentry kind="con" path="WOFramework/JavaFoundation"/>
<classpathentry kind="con" path="WOFramework/JavaJDBCAdaptor"/>
我想将所有路径复制到另一个文件中。也就是说,我希望我的输出文本文件如下所示:
WOFramework/ERExtensions
WOFramework/ERJars
WOFramework/ERPrototypes
WOFramework/JavaEOAccess
WOFramework/JavaEOControl
WOFramework/JavaFoundation
WOFramework/JavaJDBCAdaptor
答案1
我假设该文件遵循相同的模式。如果是这种情况,您可以使用如下命令。
grep -o ' path=.*$' file.txt | cut -c8- |rev | cut -c 4- | rev
因此,我使用打开文件cat
,然后仅从中提取字符path=
,然后使用删除不需要的字符cut
,然后使用该rev
技术从末尾删除不需要的字符。
另一种 awk 方法
awk -F'path="' '{print $2}' file.txt |rev | cut -c 4- | rev
我使用path="
作为分隔符并打印其后的所有信息。基本上与rev
上面的操作相同。
测试
cat file.txt
<classpathentry kind="src" path="Sources"/>
<classpathentry kind="con" path="WOFramework/ERExtensions"/>
<classpathentry kind="con" path="WOFramework/ERJars"/>
<classpathentry kind="con" path="WOFramework/ERPrototypes"/>
<classpathentry kind="con" path="WOFramework/JavaEOAccess"/>
<classpathentry kind="con" path="WOFramework/JavaEOControl"/>
<classpathentry kind="con" path="WOFramework/JavaFoundation"/>
<classpathentry kind="con" path="WOFramework/JavaJDBCAdaptor"/>
运行命令后,
Sources
WOFramework/ERExtensions
WOFramework/ERJars
WOFramework/ERPrototypes
WOFramework/JavaEOAccess
WOFramework/JavaEOControl
WOFramework/JavaFoundation
WOFramework/JavaJDBCAdaptor
Stephane 在评论中提供了更好的方法。
cut -d '"' -f4 file.txt
答案2
一个简单的方法awk
:
awk -F\" '/WOF/ {print $4}' abc.txt > outfile
-F\"
将字段分隔符从默认值(空格)更改为引号(用 转义\
)/WOF/
将每条记录(文件行)的返回结果限制为与模式匹配的结果:WOF
$4
是每个匹配记录的第四个字段,即路径。
答案3
grep 和 cut 的另一种方法:
grep "kind=\"con\"" sample.txt | cut -d \" -f 4 > sample_edited.txt
这将 grep 所有包含路径的行,并通过将's 分隔符kind="con"
设置为 来打印路径。cut
"
答案4
如果您的版本grep
支持 PCRE 风格的环视,则另一种解决方案
grep -oP '(?<=kind="con" path=").+?(?="/>)' abc.txt