使用 sed 和 regex 从文件中的字符串设置变量

使用 sed 和 regex 从文件中的字符串设置变量

更新针对更具体的正则表达式稍微编辑了脚本,仍然存在同样的问题。

澄清以下问题,这是我想要开始工作的确切脚本(POC 对于更大的脚本), test.txt 与我的 test.sh 文件位于同一目录中,并且我正在同一目录中运行 cd 的脚本。

另外,在修补时,我认为这可能与回车有关,但我仍然无法弄清楚出了什么问题。

结束更新

我在这里查看了粘贴一个 bash 文件,我可以运行它从特定文件中提取版本号,并通过变量使用该版本号执行操作。如果我只通过参数 $1 提供版本,则脚本的其余部分可以工作,但如果它可以直接从我想要操作的文件夹中的文件确定版本号,那就太好了。

这是我当前的脚本

#!/bin/sh
version=$(sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt)
printf 'detected version %s for test.txt\n' "$version"

它在终端中返回给我这个值

 for test.txtion 0.6

它似乎覆盖了我试图打印的字符串的一部分。如果我只看这一部分:

sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt

例如,如果文件中有一行包含此行,则它有效

Version: 0.6

我明白了:

root@webserver [/home/username]# sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p" test.txt
0.6
root@webserver [/home/username]#

对剧本有什么问题有什么想法吗?

答案1

我找到了不起作用的原因以及解决方案。正如 @eike 在我的 OP 中评论的那样,问题是 DOS 中的回车符 \r 覆盖了输出。对我来说更成问题的是, \r 由于某种原因被添加到我的变量中。

手动删除 \r 不是一个选项,因为该文件会定期更新。

经过一番搜索后,我发现这可以解决我的问题并正确打印出字符串:

#!/bin/bash
version=$(sed 's/\r$//' test.txt | sed -ne "s/\\Version *: *\([0-9a-zA-Z\.\-]+\)*/\1/p")
printf 'detected version %s for test.txt\n' "$version"

它在这里的作用是首先从文本中删除 \r 并将其传递给正则表达式部分。我得到了预期的输出:

检测到 test.txt 版本为 0.6

我确信有一种方法可以从正则表达式中执行此操作,忽略 \r,但这至少完成了工作!

相关内容