sed从文件中提取两个字符之间的子字符串并保存到变量

时间:2013-09-24 10:09:40

标签: bash sed substring

我正在自动构建一个包。自动脚本需要获取要构建的包的版本。 我需要获取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”的变量中?

version = sed -n ... 

抛出错误

  

命令-n not found

4 个答案:

答案 0 :(得分:4)

如果您只需要版本号。

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

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

答案 1 :(得分:1)

使用awk

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

解释

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

更新

  

更具体地说,该行是版本=“0.2.0.4”#DO NOT MOVE THIS   LINE

$ 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)

答案 2 :(得分:1)

尝试:

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

为了将其分配给变量,请说:

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

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

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

答案 3 :(得分:0)

分配变量时不应有空格

version=$(your code)

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

OR

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