首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在码头集装箱内使用RegEx的Grep?

在码头集装箱内使用RegEx的Grep?
EN

Stack Overflow用户
提问于 2020-10-30 05:15:32
回答 2查看 1.6K关注 0票数 1

第一次涉足Bash编码(也不是最有经验的Linux人员),我正在尝试从容器中读取version.php版本:

/config/www/nextcloud/version.php

为了做到这一点,我运行:

代码语言:javascript
复制
docker exec -it 1c8c05daba19 grep -eo "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?" /config/www/nextcloud/version.php

它使用语义版本化RegEx模式(我知道,有点过火,但目前起作用)从行中读取和提取版本:

$OC_VersionString = '20.0.1';

但是,当我运行命令时,它告诉我No such file or directory,(我已经确认它确实存在于容器中的那个路径中),然后继续吐出它刚才说的不存在的文件的全部内容。

grep:(0|1-9\d*).(0|1-9\d*).(0|1-9\d*)(?:-((?:0|1-9\d*|\d*a-zA-Z-)(?:.(?:0|1-9\d|\d*a-zA-Z-))))?(?:+(0-9a-zA-Z-+(?:.0-9a-zA-Z-+)*))?:没有这样的文件或目录/config/www/nextcloud/version.php:$OC_Version = array(20,0,1,1);/config/www/nextcloud/version.php:$OC_VersionString = '20.0.1';/config/www/nextcloud/version.php:$OC_Edition = '';/config/www/nextcloud/version.php:$OC_VersionCanBeUpgradedFrom =数组( /config/www/nextcloud/version.php:'nextcloud‘=> /config/www/nextcloud/version.php:'owncloud’=> /config/www/nextcloud/version.php:$供应商= 'nextcloud';

有人能发现问题吗?

更新1:

为了清晰起见,我试图从bash脚本中运行这个脚本。我只想从该文件中获取版本号,以便在脚本的其他区域使用它。

更新2:

响应这些注释,我尝试先登录到容器,然后运行grep,仍然得到相同的结果。然后我猫文件,它显示它的内容没有问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-30 14:27:51

好吧,对于任何未来的潜在读者来说,我没有运气能让grep这么做,我肯定这是我的错,而不是grep的,但多亏了在这个岗位上的帮助,我才得以使用awk而不是grep,就像这样:

代码语言:javascript
复制
docker exec -it 1c8c05daba19 awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){print substr($0,RSTART+1,RLENGTH-2)}' /config/www/nextcloud/version.php

最终做了我所需要的事情:

  • 它会登录到码头集装箱里。
  • 扫描并返回我正在寻找的行中的版本号:容器中的/config/www/nextcloud/version.php
  • 退出阶段从容器左与我只需要的信息。
  • 我可以马上回去吃我的热芝士。
票数 0
EN

Stack Overflow用户

发布于 2020-10-30 12:03:59

许多容器没有Unix工具的GNU版本及其各种扩展。它在阿尔卑斯Linux上很流行,它使用一个非常轻量级的名为BusyBox的单二进制工具来提供基本工具。它们往往有POSIX规范中所要求的一组选项,而且不再有。

特别是POSIX (1)没有-o选项。所以你要运行的命令是

代码语言:javascript
复制
grep                                 \
  -eo                                \ # specify "o" as the regexp to match
  "(regexps are write-only)"         \ # a filename
  /config/www/nextcloud/version.php    # a second filename

注意,交互式shell中的grep输出仅包含字母"o“的行,而不包含仅包含array的行。

POSIX与grep的-o选项没有等效之处。

只打印匹配线的匹配(非空)部分,其中每个匹配部分位于单独的输出线上。输出行使用与输入相同的分隔符.

但是使用sed(1)很容易做到这一点。让它匹配一些东西,问题中的regexp,和一些东西,并用匹配的组替换它。

代码语言:javascript
复制
sed -e 's/.*\(any regexp here\).*/\1/' input-file

(POSIX sed只接受基本正则表达式,因此必须转义更多的括号。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64603054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档