pythonbrew bashrc awk行不再工作

pythonbrew bashrc awk行不再工作,python,awk,pythonbrew,Python,Awk,Pythonbrew,我最近升级了我的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

我最近升级了我的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
  • 不要在printf formatting参数中放入变量,因为当变量包含printf格式字符(例如“%”)时,变量将失败。因此,请使用
    printf“%s”“$PATH”
    而不是
    printf“$PATH”
  • 使用双引号分隔awk脚本从来都不是一个好主意,因为它在脚本的其余部分引入了双引号地狱。因此,请使用
    “/”${PATH\u ROOT//\/\/}“/{…}”
    而不是
    “/${PATH\u ROOT//\/\/}/{…}”
  • 允许shell变量扩展动态地提供awk脚本主体的一部分几乎从来都不是一个好主意,因为它可能会引入奇怪的语法错误。因此,请使用
    awk-v path\u root=“${path\u root/\/\/\/\/}”$0~path\u root{…}
    而不是
    “${path\u root/\/\/\/}”/{…}
  • 如果条件不存在,您可以只测试条件的否定性,而不是测试条件并使用next然后使用打印
  • 当将两个变量设置为相同的值(例如RS和ORS)时,最好将它们设置在一起,而不是单独设置
  • 总之,作为起点,您的脚本应该是:

    PATH_WITHOUT_PYTHONBREW=$(printf "%s" "$PATH" |
        awk -v path_root="${PATH_ROOT//\//\/}" 'BEGIN{RS=ORS=":"} $0 !~ path_root' |
        sed -e 's#:$##')
    
    假设您的路径根操作是有意义的

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

  • 不要在printf formatting参数中放入变量,因为当变量包含printf格式字符(例如“%”)时,变量将失败。因此,请使用
    printf“%s”“$PATH”
    而不是
    printf“$PATH”
  • 使用双引号分隔awk脚本从来都不是一个好主意,因为它在脚本的其余部分引入了双引号地狱。因此,请使用
    “/”${PATH\u ROOT//\/\/}“/{…}”
    而不是
    “/${PATH\u ROOT//\/\/}/{…}”
  • 允许shell变量扩展动态地提供awk脚本主体的一部分几乎从来都不是一个好主意,因为它可能会引入奇怪的语法错误。因此,请使用
    awk-v path\u root=“${path\u root/\/\/\/\/}”$0~path\u root{…}
    而不是
    “${path\u root/\/\/\/}”/{…}
  • 如果条件不存在,您可以只测试条件的否定性,而不是测试条件并使用next然后使用打印
  • 当将两个变量设置为相同的值(例如RS和ORS)时,最好将它们设置在一起,而不是单独设置
  • 总之,作为起点,您的脚本应该是:

    PATH_WITHOUT_PYTHONBREW=$(printf "%s" "$PATH" |
        awk -v path_root="${PATH_ROOT//\//\/}" 'BEGIN{RS=ORS=":"} $0 !~ path_root' |
        sed -e 's#:$##')
    
    假设您的路径根操作是有意义的


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

    在我看来,您尝试读取
    awk
    代码中的变量。像这样使用
    awk
    awk-vrs=:-vrs=:-v path=$path\u root'$0==path{next…
    Does
    ${path\u root/\/\/\\\/}
    工作?尽管@Jotne建议使用
    -v
    可能是一个更好的计划。尽管使用
    $0~path
    如果您希望正则表达式匹配而不是相等。在我看来,您尝试读取
    awk
    代码中的变量。像这样使用
    awk-v RS=:-v-path=$path\u root'$0==path{下一步…
    执行
    ${PATH\u ROOT//\/\\/}
    工作?尽管@Jotne建议使用
    -v
    可能是一个更好的计划。尽管使用
    $0~path
    ,如果您希望正则表达式匹配而不是相等。太棒了,谢谢!在$0前面有一个额外的单引号,我无法删除,因为它希望编辑至少为6个字符,但一旦删除,它就可以工作了eat。我也会考虑将此作为修补程序添加到pythonbrew中。不客气,我更新了脚本以删除该单引号。如果您想用一些示例更新您的问题,说明“路径”可以包含哪些内容,以及您想要什么“没有pythonbrew的路径”要设置为给定这些路径设置,我相信我们可以向您展示如何在单个awk命令中轻松完成,而不是调用多个命令和管道。太棒了,谢谢!在$0前面有一个额外的单引号,我无法删除,因为它希望编辑至少为6个字符,但一旦删除,它就非常有用。我将考虑将此作为修补程序添加到pythonbrew。不客气,我更新了脚本以删除该单引号。如果您想用一些示例更新您的问题,说明“路径”可以包含哪些内容,以及您希望“路径”不包含pythonbrew”要设置为给定这些路径设置,我相信我们可以向您展示如何在单个awk命令中轻松地完成,而不是调用多个命令和管道。