我有一个如下所示的文件
<g> Good wheatear </g> other parts of line
<g> The farm land is to be sold </g> other parts of line
<g> knock knock </g> other parts of line
我希望我的输出是这样的:
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
即打印 <g> 和 </g> 标签之间的内容(包括标签)
我尝试过这个命令:
awk '/<s>/, /<\/s>/' trsTest.txt
但它打印整行。
如何打印标签之间的内容?
答案1
有了awk
它可能是:
$ awk -v FS="</?g>" '{print $2}' trsTest.txt
Good wheatear
The farm land is to be sold
knock knock
或者,如果您想保留标签:
$ awk -v FS="</g> " '{print $1 FS}' trsTest.txt
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
答案2
您可以简单地使用 GNU grep 并仅打印行的匹配部分 ( -o
):
grep -o '<g>.*<\/g>' trsTest.txt
该模式需要位于单引号之间,以防止 shell 扩展字符(如*
)
第一个命令将产生:
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
如果您不希望包含标签,那么您可以这样做:
sed 's/.*<g>\(.*\)<\/g>.*/\1/' trsTest.txt
其工作方式如下:
<g>
匹配开始标记之前的所有内容(包括开始标记)\(
我记得上面使用和之间的东西\)
- 匹配结束
<\g>
标记之后到行尾的任何内容 - 然后替换成记住的内容
\1
第二个命令将产生:
Good wheatear
The farm land is to be sold
knock knock
答案3
如果这是 XML,您可以使用 XML 解析器,例如xmlstarlet
. (如果它是 HTML,您仍然可以使用,xmlstarlet
但您必须警告它结构可能会被破坏。)
我添加了一个边界<root/>
元素以使输入合法 XML:
<root>
<g> Good wheatear </g> other parts of line
<g> The farm land is to be sold </g> other parts of line
<g> knock knock </g> other parts of line
</root>
然后挑选</g>
元素和值的命令是
xmlstarlet sel --template --match '//g' --copy-of '.' --nl file.xml
输出
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
xmlstarlet
与通用文本解析工具(例如sed
或 )相比,其优点grep
在于它能够理解 XML 结构,因此,如果输入文件稍有更改但仍然保持有效的 XML,则xmlstarlet
仍然能够解析它。
答案4
如果标签始终相同,要包含标签,请使用 sed
sed 's/\(.*>\).*/\1/' trsTest.txt
输出为:
<g> Good wheatear </g>
<g> The farm land is to be sold </g>
<g> knock knock </g>
更新了卡西莫多更高效的代码块