我正在Linux终端上工作。 我有一个字符串,后跟一个数字作为stdout,并且我需要一个命令,该命令用数字替换字符串的中间并将结果写入stdout。
这是字符串和数字:图书管理员16 这应该是输出:l16n
我尝试使用echo librarian 16|sed s/[a-z]*/16/g
,这给我提供了9999个问题,因为它分别替换了每个字母,并且也替换了第一个和最后一个字母,而且我不能使它使用stdout中的数字
我也尝试过使用cut -c 1-1
,sed s/[^0-9]*//g
和cut-c 9-9
分别生成l,16和n,但是我找不到如何将它们的输出合并为一行。 / p>
最近,我尝试使用文本编辑器复制数字并将其粘贴到字符串中,但是由于我不知道如何直接从命令行使用编辑器,因此我没有取得太大进展。
答案 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