【问题标题】:Extracting values between keys using sed使用 sed 提取键之间的值
【发布时间】:2019-07-31 14:52:14
【问题描述】:

我正在尝试提取作为命令行 bash 脚本选项输入的键的值,但失败了。

我已经尝试将正则表达式与 grep 和 sed 匹配,无论是否使用 -E 选项。我可以使用 grep 从初始命令输入中提取键:

grep -wo -- "-[^ ]*"

可以从命令行中提取具有"-""--" 格式的键,但如果没有其他键,我需要两个键之间的值或从键到行尾的值。

key="-r"
input="command -r root1 root2 -s ip"

echo $input | sed "s/^.*$key \([^-]\+\)\( -.\+$\|$\)/$key has value \1/g;"

输出:

命令 -r root1 root2 -s ip

预期输出:

root1 根2

显然,\1 匹配整行,但我只需要从$key 到下一个键或行尾的输入行的内容。任何帮助将不胜感激。

【问题讨论】:

  • 您是否特别想获取选项 -r 的值?
  • 在这个例子中,是的。脚本有许多开关。我有一个用于开关$(echo "$*" | grep -wo -- "-[^ ]*" ) 的变量,然后循环通过开关,用case 语句解析它们,然后根据开关的值执行一些不同的命令。开关具有 -a 或 --assign 之类的值,每个开关可以具有一个或多个值,具体取决于输入是选项还是设备列表。命令行输入的一些示例是:command.sh device1 device2command.sh device1 -s ipcommand.sh --root CompanyDevice --first 35 --last 99"
  • 另外,我建议检查一下 bash 的 getopts 内置功能。 (只需在 bash 终端上运行 help getopts。)
  • 如果你分开$1$2然后使用input="$*",那么这是错误的方法。只是循环通过"$@" 是更好的选择。使用forgetopts 手动循环。谷歌getopts examples。应该有很多。请注意,getoptsgetopt 是不同的。 getopts 更简单,并且内置在 bash 中。

标签: bash sed


【解决方案1】:

通过“可能重复”评论中的一些示例来解决这个问题。

key="-a";
input="command -a option1 option2 -r root1 root2 -s ip ip ip";
echo $input | sed -E "s/^.*$key ([^-]*)(-.*$|$)/\1/g;"

产生所需的“option1 option 2”输出。我认为 sed 不喜欢我的 \(..\|..\) 子句。切换到sed -E 并删除了反斜杠,它就可以工作了。

感谢您的帮助。

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    key='-r'
    sed -En 's/ -\w */\n&/g;s/.*\n '$key' *([^\n]*).*/\1/p' file
    

    在每个选项前加上一个换行符,然后提取所需的选项直到下一个换行符。

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2017-12-13
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多