我有以下列表,我想按数字拆分。例如:
从:
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
这里还有两个选择:
grep
grep -oP '\d+|.*' file
解释:
-P
: 激活 Perl 兼容正则表达式,让我们可以使用\d
数字。|
符号逻辑OR
表示grep
将第一的尝试匹配一个或多个 (+
) 数字,并且然后其余一切(.*
)。-o
:这会导致grep
仅打印输入行的匹配部分。副作用是,如果一行有多个匹配项,它会在新行上打印每个匹配项,因此会产生所需的输出。
Perl
perl -lne 's/(\d+)(\D+)/$1\n$2/; print;' file
解释:
- 方法
-n
是逐行读取文件,并将给出的脚本应用-e
到每一行。i-l
)\n
从行尾删除换行符()并且 ii)\n
在每个换行符后添加一个print
。 s/pattern/replacement/
: 替换pattern
为replacement
。(\d+)(\D+)
:匹配一个或多个数字(\d
),后跟一个或多个非数字(\D
)。括号()
表示匹配被捕获因此我们可以将它们称为$1
和$2
。- 综合起来,替换只会在数字字符串和随后的非数字之间插入一个换行符。然后
print
只会打印该行。
- 方法