如何通过bash提取一些文本

时间:2012-04-09 12:02:24

标签: linux bash parsing shell

我有一个输出:

 <artifactId>prj-parent</artifactId>
 <version>1.11.1-Beta01-SNAPSHOT</version>

如何使用linux命令仅提取1.11.1-Beta01-SNAPSHOT? 谢谢!

6 个答案:

答案 0 :(得分:5)

您可以使用grep

  echo $string | grep -P -o '(?<=<version>).*?(?=</version>)'

答案 1 :(得分:3)

grep '<version>' | replace "<version>" "" "</version>" ""

每行一个条目

答案 2 :(得分:3)

awk -F '[<>]' '$2 == "version" {print $3}'

答案 3 :(得分:2)

GNU sed:

sed -nr '/<\/?version>/s///gp'

答案 4 :(得分:1)

a="<artifactId>prj-parent</artifactId>\n<version>1.11.1-Beta01-SNAPSHOT</version>"
echo $a | grep -oe "<version>.*</version>" | cut -d">" -f2- | cut -d"<" -f1

答案 5 :(得分:1)

TXR:

$ txr -c "@(skip)
 <artifactId>@aid</artifactId>
 <version>@version</version>" data.txt
aid="prj-parent"
version="1.11.1-Beta01-SNAPSHOT"

仅设置eval命令和shell变量version。您可以检查aid以获取正确的工件ID。如果txr找不到匹配项,则会失败并打印单词false。在eval下,此false将创建失败的终止状态:

if $(txr -c "@(skip)
 <artifactId>@aid</artifactId>
 <version>@version</version>") ; then
  echo "version captured: $version"
else
  echo "failed to match, uh oh!"
fi

使用TXR提取XML并不像使用XML解析器然后访问节点结构那样理想,但它比使用简单的正则表达式更加健壮,这些正则表达式可以锁定最少量的上下文来完成工作,并且仅用少量例子验证。

对于这些类型的任务,您并没有真正拥有软件工程的奢侈品,而是拥有严格测试套件的解决方案。数据的变化甚至不是预先知道的,或者可能存在大量数据(例如从大日志中提取),其中很难发现错误。 (如果说,日志中每10,000个条目中有2个被提取错误,有人会抓到错误吗?)数据也会改变。明天会有人更改XML,而你的正则表达式黑客会将一些错误的文本拉出来作为版本。

最好的方法是编写非常具体的匹配,只允许输入之间的相关预期变化,并且如果存在不匹配则会抱怨。