【问题标题】:sed extract substring between two characters from a file and save to variablesed 从文件中提取两个字符之间的子字符串并保存到变量
【发布时间】:2013-09-24 10:09:40
【问题描述】:

我正在自动构建一个包。自动化脚本需要获取要构建的包的版本。 我需要获取python脚本main.py的字符串。它在第 15 行中说

VERSION="0.2.0.4" #DO NOT MOVE THIS LINE

我需要0.2.0.4,以后很容易变成0.10.3.15左右,所以sed命令不能有固定长度。 我在stackoverflow上找到了这个:

sed -n '15s/.*\#\([0-9]*\)\/.*/\1/p'

“这会抑制除第二行之外的所有内容,然后回显 # 和 / 之间的数字”

这不起作用(已调整)。最后一个“/”是哪个?如何将输出保存到名为“版本”的变量中?

version = sed -n ... 

抛出错误

command -n not found

【问题讨论】:

    标签: bash sed substring


    【解决方案1】:

    如果你只需要版本号。

    awk -F\" 'NR==15 {print $2}' main.py
    

    这会在第 15 行打印 " 之间的所有内容。例如 0.2.0.4

    【讨论】:

    • 这也是一个很好的答案,我将它与接受的一个结合起来。对不起,我只能接受一个,但投了赞成票……接受答案的作者付出了很多努力:)
    【解决方案2】:

    awk:

    $ awk -F= 'NR==15 {gsub("\"","",$2); print $2}' main.py
    0.2.0.4
    

    说明

    • NR==15 在第 15 行执行操作。
    • -F= 将字段分隔符定义为=
    • {gsub("\"","",$2); print $2} 删除第二个字段中的 " 字符并打印出来。

    更新

    更具体地说,该行是 version="0.2.0.4" #DO NOT MOVE THIS 线

    $ awk -F[=#] 'NR==15 {gsub("\"","",$2); print $2}' main.py
    0.2.0.4 
    

    使用多字段分隔符-F[=#],这意味着它可以是#=

    要将其保存到您的version 变量中,请使用表达式var=$(command),例如:

    version=$(awk -F[=#] 'NR==15 {gsub("\"","",$2); print $2}' main.py)
    

    【讨论】:

    • 这是一半的工作,它不会在4 之后停止并打印该行的其余部分。更具体地说,该行是version="0.2.0.4" #DO NOT MOVE THIS LINE
    • @user2366975 它正在按照您的输入进行工作。请更新您的问题以表明真实输入,以便结果有效。
    • 我明白你的意思,但我认为“两个字符之间”的问题很清楚
    • 对不起,我不记得那部分了,@user2366975:D
    • 这似乎工作得更好,但我仍然有 2 个符号问题:输出是字符串还是什么?我需要创建一个包含版本的文件。以及如何在不调用“awk”的情况下检查输出“版本”?
    【解决方案3】:

    试试:

    sed -n '15s/[^"]*"\(.*\)".*/\1/p' inputfile
    

    为了将它分配给一个变量,比如说:

    VARIABLE=$(sed -n '15s/[^"]*"\(.*\)".*/\1/p' inputfile)
    

    为了消除 VERSION 仅出现在第 15 行的依赖关系,您可以说:

    sed -n '/^VERSION=/ s/[^"]*"\(.*\)".*/\1/p' inputfile
    

    【讨论】:

      【解决方案4】:

      分配变量时不应有空格

      version=$(your code)
      
      version=$(sed -r -i '15s/.*\"\([0-9]*\)\/.*/"/p' main.py)
      

      version=`sed -r -i '15s/.*\"\([0-9]*\)\/.*/"/p' main.py`
      

      【讨论】:

      • version=sed -r -i '15s/.*\"\([0-9]*\)\/.*/"/p' main.py
      • 我怎样才能看到输出?我什至不知道它是否有任何作用。
      • echo $version 应该给你输出
      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 2013-01-31
      • 2013-12-11
      • 2013-12-12
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      相关资源
      最近更新 更多