将标准输出中的数字插入标准输出中的字符串

时间:2019-10-27 16:15:33

标签: linux shell

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

这是字符串和数字:图书管理员16 这应该是输出:l16n

我尝试使用echo librarian 16|sed s/[a-z]*/16/g,这给我提供了9999个问题,因为它分别替换了每个字母,并且也替换了第一个和最后一个字母,而且我不能使它使用stdout中的数字

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

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

1 个答案:

答案 0 :(得分:1)

因此,您想要的是捕获第一个字母,最后一个字母和数字,而忽略中间的字母。

在正则表达式中,我们使用()告诉引擎我们要捕获的内容,其他任何事物都只是被匹配或“吃掉”,但未被捕获。因此模式应如下所示:

([a-z])[a-z]*([a-z]) ([0-9]+)
  • ([a-z])捕获第一个字母
  • [a-z]*以匹配零个或多个字符,但无法捕获。我们之所以选择“ *”,是因为中间可能没有任何匹配项,例如两个或更少的字母。
  • ([a-z])捕获最后一个字母。
  • 以“吃掉”空白。
  • ([0-9]+)来捕获号码。我们使用+代替*,因为我们需要此位置的数字。

sed对这些结构使用了不同的语法,因此我们将使用-E标志。您可以没有它,但是必须转义IMO使模式变得混乱的()+字符。

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

\1\3\2
  • \1:首字母
  • \3:数字
  • \2:最后一个字母

现在,我们将所有内容放在一起:

$ echo librarian 16|sed -r 's/([a-z])[a-z]*([a-z]) ([0-9]+)/\1\3\2/g'
l16n