使用正则表达式使用 Linux 工具(如 sed 或 awk)在最后一位数字处拆分文本

使用正则表达式使用 Linux 工具(如 sed 或 awk)在最后一位数字处拆分文本

我有以下列表,我想按数字拆分。例如:

从:

103Ru
103mRh
104
1041

到:

103
Ru
103
mRh
104
1041

我想使用 Regx 和 sed 或者 awk 来实现这个结果。但我的大多数方法都失败了。我需要一些建议或解决方案。谢谢

答案1

$ sed -r 's/([0-9])([^0-9])/\1\n\2/g' filename 
103
Ru
103
mRh
104
1041

上述正则表达式查找后面跟着非数字的数字。如果找到,则在它们之间插入换行符。

更详细地说,sed 命令的形式s/old/new/为 查找old并替换为new。在我们的例子中,old由两个字符组成:([0-9])匹配任何数字,并且由于它被括在括号中,因此它会保存该值。 ([^0-9])匹配除数字以外的任何内容并将其保存。如果找到这两个字符,则将其替换为\1\n\2这意味着第一个匹配项(数字)、换行符和第二个匹配项(非数字)。

更多的:如果我们想在数字的开头和结尾处中断,那么我们再添加一个替换命令:

$ echo xyz541wpk | sed -r 's/([0-9])([^0-9])/\1\n\2/g; s/([^0-9])([0-9])/\1\n\2/g'
xyz
541
wpk

第二个替换命令与第一个类似,但它寻找的是反向模式:非数字后跟数字。

答案2

这里还有两个选择:

  1. grep

    grep -oP '\d+|.*' file
    

    解释:

    • -P: 激活 Perl 兼容正则表达式,让我们可以使用\d数字。|符号逻辑OR表示grep第一的尝试匹配一个或多个 ( +) 数字,并且然后其余一切(.*)。
    • -o:这会导致grep仅打印输入行的匹配部分。副作用是,如果一行有多个匹配项,它会在新行上打印每个匹配项,因此会产生所需的输出。
  2. Perl

    perl -lne 's/(\d+)(\D+)/$1\n$2/; print;' file
    

    解释:

    • 方法-n是逐行读取文件,并将给出的脚本应用-e到每一行。i -l)\n从行尾删除换行符()并且 ii)\n在每个换行符后添加一个print
    • s/pattern/replacement/: 替换patternreplacement
    • (\d+)(\D+):匹配一个或多个数字(\d),后跟一个或多个非数字(\D)。括号()表示匹配被捕获因此我们可以将它们称为$1$2
    • 综合起来,替换只会在数字字符串和随后的非数字之间插入一个换行符。然后print只会打印该行。

相关内容