sed 没有给我两个文件相同的值

sed doesn't give me the same value two files

我注意到 sed 没有给我相同的输出

NOD=$(sed -n '/uid=/{s/.*uid=//;p;}' /home/user/config.xml | tail -c +2 |  rev | cut -c6- | rev)

文件包含:

<gateway  ws="ws://1.1.1.23:8333" uid="123B0X3C"/>

结果是 123B0X3C,但是当我尝试另一个端点时

<gateway  ws="ws://1.1.1.23:8333" uid="1541CCF5"/>

结果是 1541CCF

为什么?

想法是在没有“”和结束标记字符的 uid 选项中获取该数字

您可以为此使用单个 sed

NOD=$(sed -n 's/.*uid="\([^"]*\).*//p' /home/user/config.xml)

这里,

  • -n - 抑制默认行输出
  • .*uid="\([^"]*\).* - 查找任何文本,uid=" 文本,然后将 " 字符以外的任何零个或多个字符捕获到组 1 中,然后匹配字符串的其余部分
  • </code> - 将匹配的行替换为第 1 组值</li> <li><code>p - p打印成功替换的结果。

看到一个 online demo:

#!/bin/bash
s='<gateway  ws="ws://1.1.1.23:8333" uid="123B0X3C"/>'
NOD=$(sed -n 's/.*uid="\([^"]*\).*//p' <<< "$s")
echo "$NOD"
## => 123B0X3C

这可以简单地完成 awk。使用您显示的示例,请尝试遵循 awk 代码。简单的解释是,将所有行的字段分隔符设置为 uid=""/>,然后打印该行的第二个字段。

awk -F'uid="|"/>' 'NF>=2{print }' Input_file

这有效

NOD=$(sed -n 's/.*uid="\([^"]*\).*//p' /home/user/config.xml)

但我很好奇为什么那不起作用。 当我检查变量的长度时,它显示 8,但回显只显示 7 个字符。 当我将结果移动到文件和 wc -c 时,它得到 15 和 14 个字符(一个文件和另一个文件)。我检查了空格,但配置是一样的。