AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 924181
Accepted
Danny F
Danny F
Asked: 2018-07-31 15:19:34 +0800 CST2018-07-31 15:19:34 +0800 CST 2018-07-31 15:19:34 +0800 CST

使用 sed 删除数字字符串末尾的字符

  • 772

这是我的源文件的示例:

USC00020958       -7777S   656S   721S   803S   891S   975S   972S   941S   906S   809S   695S   605S
USC00021001         378S   389R   448R   522R   628R   736S   774S   742S   674S   562S   454R   376R
USC00021026         689R   729R   792R   873R   969R  1060R  1082R  1068R  1015R   903R   775R   682R
USC00021050         663S   713S   796S   885S   984S  1079S  1122S  1103S  1036S   904C   754S   651S
USC00501466         -77R     8R   168R   408R   593R   723R   733R   660R   529R   273R    54R    -7R
USW00501492         -43R    18R   132R   308R   510R   666R   687R   605R   466R   239R    45R    12R
USW00501497           3Q    -1Q     0P   203Q   388Q   539Q   558Q   493Q   362Q   175Q    51Q    27Q
USW00501684        -118R     0P   211R   413R   573R   700R   710R   644R   520R   294R    35R   -67R
USW00501926         184S   223S   303S   418S   544S   651S   661R   617S   519S   353S   227S -7777S

我想从 1-4 位数字的末尾删除 C、S、R、P、Q,同时保留负 (-) 数,并且在此示例中不修改第一列 (USxxxxxxxxx)。我还想将格式更改为在每个值之间有一个空格(或逗号)。这是我尝试过的,但它没有产生我希望的结果:

[user@host1 ~]# cat sample.txt | sed -E 's/(\S+)\s+(.[0-9]{1,4})[C,S,R,P,Q]/\1 \2/g'
USC00020958 -7777   656S 721   803S 891   975S 972   941S 906   809S 695   605S
USC00021001 378   389R 448   522R 628   736S 774   742S 674   562S 454   376R
USC00021026 689   729R 792   873R 969  1060R 1082  1068R 1015   903R 775   682R
USC00021050 663   713S 796   885S 984  1079S 1122  1103S 1036   904C 754   651S
USC00501466 -77     8R 168   408R 593   723R 733   660R 529   273R 54    -7R
USW00501492 -43    18R 132   308R 510   666R 687   605R 466   239R 45    12R
USW00501497  3    -1Q  0   203Q 388   539Q 558   493Q 362   175Q 51    27Q
USW00501684 -118     0P 211   413R 573   700R 710   644R 520   294R 35   -67R
USW00501926 184   223S 303   418S 544   651S 661   617S 519   353S 227 -7777S
regex
  • 1 1 个回答
  • 135 Views

1 个回答

  • Voted
  1. Best Answer
    Damian T.
    2018-07-31T19:14:32+08:002018-07-31T19:14:32+08:00

    关于您的正则表达式,我注意到了几件事:

    1. 指定字符类时,不要在字母之间使用逗号。您可以使用破折号来指定范围,但在这种情况下,[C,S,R,P,Q]应该是,而不是[CSRPQ]。
    2. sed不要求您匹配整行,因此您可以构建一个模式以将数字与尾随字母匹配,然后将其替换为数字本身(删除字母)。

    我获取了您提供的输入文件并测试了以下sed命令:

    sed -E 's/([0-9]+)[CSRPQ]/\1/g' sample.txt
    

    这会产生以下输出:

    USC00020958       -7777   656   721   803   891   975   972   941   906   809   695   605
    USC00021001         378   389   448   522   628   736   774   742   674   562   454   376
    USC00021026         689   729   792   873   969  1060  1082  1068  1015   903   775   682
    USC00021050         663   713   796   885   984  1079  1122  1103  1036   904   754   651
    USC00501466         -77     8   168   408   593   723   733   660   529   273    54    -7
    USW00501492         -43    18   132   308   510   666   687   605   466   239    45    12
    USW00501497           3    -1     0   203   388   539   558   493   362   175    51    27
    USW00501684        -118     0   211   413   573   700   710   644   520   294    35   -67
    USW00501926         184   223   303   418   544   651   661   617   519   353   227 -7777
    

    该命令匹配任何有尾随[CSRPQ]然后剥离字母的数字。

    此外,如果您想删除所有空格并用逗号替换以将其转换为 CSV,sed允许您链接表达式。但是,当指定多个脚本时,您需要-e在它们前面放置以告诉sed后面有一个脚本。从帮助:

    Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
    
      -e script, --expression=script
                     add the script to the commands to be executed
    

    这是一个例子:

    sed -E -e 's/([0-9]+)[CSRPQ]/\1/g' -e 's/\s+/,/g' sample.txt
    

    这表示运行第一个替换,然后运行第二个替换,用单个逗号替换重复的空格字符。这会产生以下输出:

    USC00020958,-7777,656,721,803,891,975,972,941,906,809,695,605
    USC00021001,378,389,448,522,628,736,774,742,674,562,454,376
    USC00021026,689,729,792,873,969,1060,1082,1068,1015,903,775,682
    USC00021050,663,713,796,885,984,1079,1122,1103,1036,904,754,651
    USC00501466,-77,8,168,408,593,723,733,660,529,273,54,-7
    USW00501492,-43,18,132,308,510,666,687,605,466,239,45,12
    USW00501497,3,-1,0,203,388,539,558,493,362,175,51,27
    USW00501684,-118,0,211,413,573,700,710,644,520,294,35,-67
    USW00501926,184,223,303,418,544,651,661,617,519,353,227,-7777
    

    希望这可以帮助!

    • 2

相关问题

  • 通过正则表达式对终端进行全局着色

  • 用于正则表达式替换的 Bash 命令

  • 将执行 Perl REGEX 扩展的 Lex Flex 变体

  • AWSStats 忽略除一个子目录以外的所有子目录

  • 使用正则表达式在 linux 中重命名文件

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve