首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将来自stdout的数字插入来自stdout的字符串

将来自stdout的数字插入来自stdout的字符串
EN

Stack Overflow用户
提问于 2019-10-28 00:15:34
回答 1查看 53关注 0票数 1

我在一个Linux终端上工作。我有一个后跟数字的字符串作为stdout,我需要一个命令将字符串的中间部分替换为数字,并将结果写入stdout。

这是字符串和数字: librarian 16,输出应该是: l16n

我试过使用echo librarian 16|sed s/[a-z]*/16/g,得到9999个结果,问题是它分别替换了每个字母,也替换了第一个和最后一个字母,我不能让它使用标准输出中的数字。

我还尝试使用cut -c 1-1sed s/[^0-9]*//gcut-c 9-9分别生成l、16和n,但我找不到如何将它们的输出合并到一行中。

最后,我尝试使用文本编辑器复制数字并将其粘贴到字符串中,但由于我不知道如何从命令行直接使用编辑器,因此没有取得太大进展。

EN

回答 1

Stack Overflow用户

发布于 2019-10-28 02:03:20

所以你想要的是捕获的第一个字母,最后一个字母和数字,而忽略中间部分。

在正则表达式中,我们使用()来告诉引擎我们想要捕获什么,其他任何东西都会被简单地匹配,或者“吃”,但不会被捕获。因此,模式应该如下所示:

代码语言:javascript
运行
复制
([a-z])[a-z]*([a-z]) ([0-9]+)

  • ([a-z])捕获匹配零个或多个字符的第一个letter
  • [a-z]*,但不捕获。我们在这里选择"*“,因为在中间可能没有任何匹配的东西,比如当有两个或更少的letters.
  • ([a-z])来捕获最后一个字母时。
  • 来”吃“这个数字来捕获数字。我们使用+而不是*,因为我们需要在这个位置一个数字。

对于这些构造,sed使用了不同的语法,所以我们将使用-E标志。你可以没有它,但是你必须转义()+字符,这使得模式有点混乱。

现在,为了检索捕获的内容,我们必须使用特定于引擎的字符序列。sed使用\n,其中n是捕获组的编号,因此我们的最终模式应该如下所示:

代码语言:javascript
运行
复制
\1\3\2

  • \1:First letter
  • \3:Number
  • \2:Last Last letter

现在我们把所有的东西放在一起:

代码语言:javascript
运行
复制
$ echo librarian 16|sed -r 's/([a-z])[a-z]*([a-z]) ([0-9]+)/\1\3\2/g'
l16n
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58581155

复制
相关文章

相似问题

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