打印文本文件中预定义标记之间的行的一部分

打印文本文件中预定义标记之间的行的一部分

我有一个如下所示的文件

<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>

更新了卡西莫多更高效的代码块

相关内容