【问题标题】:sed on a file equate to a variable文件上的 sed 等同于变量
【发布时间】:2017-11-30 21:01:20
【问题描述】:

这是我的 shell 命令:

  temp=`cat ./myFile.xml`
  perry=`$(echo "$temp"| sed -n 's:.*<myTag>\(.*\)</myTag>.*:\1:p')`
  echo "$perry"

不幸的是,'perry' 变量从不打印,它只是打印一个空行,这是怎么回事?

示例 xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="foo" xmlns:xsi="bar"
         xsi:schemaLocation="foo">
  <myTag>
   .... several tags inside...
  </myTag>
</project>

我的最终目标是从标准 xml 文件中捕获所有内容,然后在其上运行“awk”命令来替换某些部分(在增加版本号之后),仅供参考。

谢谢!

【问题讨论】:

  • xml 文件中的数据示例会很好

标签: linux bash macos shell sed


【解决方案1】:

您同时使用反引号和$() 来执行第二个作业中的命令。他们都执行包含的命令并将其替换回命令行。所以sed的结果被作为一个命令来执行,它的输出被放入perry。由于标签的内容可能不是有效的命令,所以第二次执行出错。

改掉在 shell 中使用反引号的习惯,直接使用$()

temp=$(cat ./myFile.xml)
perry=$(echo "$temp"| sed -n 's:.*<myTag>\(.*\)</myTag>.*:\1:p')
echo "$perry"

但是,这仅在 &lt;myTag&gt;&lt;/myTag&gt; 位于同一行时才有效,因为 sed 一次运行一行。所以它不适用于您在问题中发布的示例文件(我在添加之前写了上面的答案)。 从 XML 文件中提取数据的更好工具是 xmlstarlet

【讨论】:

  • 它不起作用。 perry 变量永远不会被打印出来。我在 Mac 上的终端中运行它。会不会是操作系统问题?但是,如果我直接回显cat ./myFile.xml | ,它打印得很好。 :|
  • 您的文件中的同一行中没有 &lt;myTag&gt;&lt;/myTag&gt;sed 一次操作一行,因此没有与正则表达式匹配的行。
  • 如果你想在shell脚本中解析XML,我建议你安装xmlstarlet
  • 我刚刚检查了var是否为空,似乎它是空的,不知道发生了什么。
  • @ParikksitBhisay 我刚刚告诉过你。仅当 &lt;myTag&gt;&lt;/myTag&gt; 在同一行时,您的 sed 命令才有效。
【解决方案2】:

如果您以后要使用 awk,请从头开始使用它:

awk '{ if ($0 ~ /<myTag>/) {strt=1} if (strt==1) {print $0} if ($0 ~ /<\/myTag>/) {strt=0} }' myfile.xml

每一行都与 "" 进行模式匹配,如果匹配,我们开始设置 strt=1 并开始打印文本。如果 "" 是模式匹配的,我们设置 strt=0 并停止打印。

您可以添加到脚本来更改标签。

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 2013-12-11
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多