【问题标题】:pythonbrew bashrc awk line no longer workspythonbrew bashrc awk 行不再有效
【发布时间】:2014-03-31 18:01:07
【问题描述】:

我最近升级了我的 FreeBSD 机器,现在 pythonbrew 似乎坏了。它退出了这一行的 .pythonbrew/etc/bashrc 文件:

PATH_WITHOUT_PYTHONBREW=$(printf "$PATH" | awk -v RS=: -v ORS=: "/${PATH_ROOT//\//\/}/ {next} {print}" | sed -e 's#:$##')

给出错误:

awk: syntax error at source line 1
   context is
      >>> //home/myusername/. <<< pythonbrew/ {next} {print}
awk: bailing out at source line 1

PATH_ROOT 变量是

/home/myusername/.pythonbrew

【问题讨论】:

  • 在我看来,您尝试读取 awk 代码中的变量。像这样使用awk awk -v RS=: -v ORS=: -v path=$path_root '$0==path {next...
  • ${PATH_ROOT//\//\\\/} 有效吗?尽管@Jotne 建议使用-v 可能是一个更好的计划。虽然使用$0 ~ path,但如果你想要正则表达式匹配而不是相等。

标签: python awk pythonbrew


【解决方案1】:
  1. 不要将变量放在 printf 格式化参数中,因为当变量包含 printf 格式化字符时会失败,例如'%'。所以使用printf "%s" "$PATH" 而不是printf "$PATH"
  2. 使用双引号来分隔 awk 脚本绝不是一个好主意,因为它在脚本的其余部分引入了双引号地狱。所以使用'/'"${PATH_ROOT//\//\/}"'/{...}' 而不是"/${PATH_ROOT//\//\/}/{...}"
  3. 允许 shell 变量扩展以动态提供 awk 脚本的部分主体几乎从来都不是一个好主意,因为它可能会引入奇怪的语法错误。所以使用awk -v path_root="${PATH_ROOT//\//\/}" '$0 ~ path_root{...}' 而不是'/'"${PATH_ROOT//\//\/}"'/{...}'
  4. 您可以只测试条件的否定,而不是测试条件并使用 next,然后在条件不存在时使用 print。
  5. 将 2 个变量设置为相同的值(例如 RS 和 ORS)时,最好将它们设置在一起而不是单独设置。

因此,作为一个起点,您的脚本将是:

PATH_WITHOUT_PYTHONBREW=$(printf "%s" "$PATH" |
    awk -v path_root="${PATH_ROOT//\//\/}" 'BEGIN{RS=ORS=":"} $0 !~ path_root' |
    sed -e 's#:$##')

假设您的 PATH_ROOT 操作是有意义的。

它可以进一步改进,但这应该足以消除您的错误。

【讨论】:

  • 太棒了,谢谢! $0 前面有一个额外的单引号,我无法删除它,因为它希望编辑至少有 6 个字符,但是一旦删除它就很好用。我也会看到将其作为补丁添加到 pythonbrew 中。
  • 不客气,我更新了我的脚本以删除那个单引号。如果您想用一些“PATH”可以包含的示例以及您希望将“PATH_WITHOUT_PYTHONBREW”设置为给定这些 PATH 设置的示例来更新您的问题,我相信我们可以向您展示如何简单地做到这一点在单个 awk 命令中,而不是调用多个命令和管道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 2019-02-08
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多