sed 在 .txt 文件中的字母组和数字组之间添加破折号

问题描述 投票:0回答:1

我有一个 txt 文件,其中包含多行文本,其中一个字符串中包含模式字母和数字,其中前面可以有任意数量的字母,后面可以有任意数量的数字。

ABC123 
ACDEG12 
AR123456 
C001

我想在字母组和数字组之间加破折号。同一文件中所需的输出如下。

ABC-123
ACDEG-12 
AR-123456 
C-001

我尝试过

sed -i '' 's/\([^0-9-]\)\([0-9]\+\)/$1-$2/' file.txt
,但没用。

我错过了什么?我使用的是 Mac。

design-patterns sed numbers alphabet
1个回答
0
投票

因此,为了防止只有字母和数字选项,我创建了这个文件(我也在 Mac 上):

echo -e "ABC123\nACDEG12\nAR123456\nC001\nABC\n123" > file.txt

您原来的 sed 命令有 3 个问题:

  1. 您在字母部分缺少量词:
    \([^0-9-]\)
  2. +
    \+
    默认在 Mac sed 上工作,因为默认情况下它使用基本的正则表达式。
  3. 替换应为
    \1
    \2
    ,而不是
    $1
    $2

最便携的方法是使用

{1,}
表示一个或多个,需要像
\{1,\}
:

一样进行转义
❯ sed -i '' 's/^\([^0-9-]\{1,\}\)\([0-9]\{1,\}\)$/\1-\2/' file.txt
❯ cat file.txt
ABC-123
ACDEG-12
AR-123456
C-001
ABC
123

如果您想要一个看起来更简单的表达式,可以使用

-E
来使用扩展(现代)正则表达式。如果您只打算在 Mac 上使用它,那应该没问题。如果您计划在其他 Linux 风格、容器等中使用它,我会首先在那里测试它,以确保它按预期工作 - 它不像第一个选项那么便携:

❯ sed -i '' -E 's/^([^0-9-]+)([0-9]+)$/\1-\2/' file.txt
❯ cat file.txt
ABC-123
ACDEG-12
AR-123456
C-001
ABC
123
© www.soinside.com 2019 - 2024. All rights reserved.