使用 sed 去除特定数量的数字

4
John, 1234567
Bob, 2839211
Alex, 2817821
Mary, 9371281

我目前正在尝试使用sed检索第二列的最后四个数字并将其作为第一列输出,因此输出应该如下所示:

John, 4567
Bob, 9211
Alex, 7821
Mary, 1281

这是我的命令:'s/\(.*,\)\(.*\)//',我认为这个命令匹配了第一列直到逗号和第二列直到结尾,但我不确定如何继续。

请翻译下列与编程有关的内容,从英语到中文。仅返回翻译后的文本:每个名称、数字和命令之间应该有一个换行符,并且命令的括号内应该有一个星号。请原谅我。 - NixyCron
该文件是否预计会有更多的列?还是格式将始终为“<文本>,<数字>”? - KamilCuk
@KamilCuk,非常感谢,它起作用了。我非常抱歉,我还是很新手,格式总是文本然后数字。 - NixyCron
@Pyrous,请澄清一下您是否在逗号字符后始终有空格字符。 - Sundeep
5个回答

2

如果您熟悉 awk,请尝试以下操作。这是在 GNU awk 中使用示例测试的。

awk 'BEGIN{FS=OFS=", "} {$2=substr($2,length($2)-3)} 1' Input_file

说明:为上述内容添加详细解释。

awk '                           ##Starting awk program from here.
BEGIN{                          ##Starting BEGIN section of this program from here.
  FS=OFS=", "                   ##Setting FS and OFS to comma space here.
}
{
  $2=substr($2,length($2)-3)    ##Getting last 4 digits now in 2nd field here.
}
1                               ##printing current edited/non-edited line.
' Input_file                    ##Mentioning Input_file name here.

第二种解决方案:如果你的第二列可能是数字和其他非数字混合的情况下,可以使用以下方法。


awk 'BEGIN{FS=OFS=", "} {gsub(/[^0-9]+/,"",$2);$2=substr($2,length($2)-3)} 1' Input_file

说明:为上述内容添加详细解释。

awk '                          ##Starting awk program from here.
BEGIN{                         ##Starting BEGIN section of this program from here.
  FS=OFS=", "                  ##Setting FS and OFS to comma space here.
}
{
  gsub(/[^0-9]+/,"",$2)        ##Globally substituting everything apart from digits with NULL in 2nd field.
  $2=substr($2,length($2)-3)   ##getting last 4 digits now in 2nd field here.
}
1                              ##printing current edited/non-edited line.
' Input_file                   ##Mentioning Input_file name here.

2

您可以使用

sed 's/^\([^,]*\), *[0-9]*\([0-9]\{4\}\).*/\1, \2/' file

查看在线演示

详情

  • ^ - 字符串的开头
  • \([^,]*\) - 第1组:除逗号以外的任何零个或多个字符
  • , * - 逗号和零个或多个空格
  • [0-9]* - 零个或多个数字
  • \([0-9]\{4\}\) - 第2组:四个数字
  • .* - 其余部分的行
  • \1, \2 - 替换为:第1组、,、空格和第2组的值。

2

只需捕获每行的最后四个数字并删除任何前面的数字:

$ sed 's/[0-9]*\([0-9]\{4\}\)$/\1/' input.txt
John, 4567
Bob, 9211
Alex, 7821
Mary, 1281

如果使用支持POSIX扩展正则表达式的sed版本,可以进行一些清理,如下所示:
sed -E 's/[0-9]*([0-9]{4})$/\1/' input.txt

1

和KamilCuk的回答类似,但使用了POSIX字符类并将数字锚定以便移除:

sed  's/, [[:digit:]]\{3\}/, /'

0

如果文件格式只是<仅文本字母数字>, <7位数字>,您可以删除前3个数字:

sed 's/[0-9][0-9][0-9]//'

这个正则表达式可以缩短为 sed 's/[0-9]\{3\}//' - fpmurphy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接