我有一个 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。
因此,为了防止只有字母和数字选项,我创建了这个文件(我也在 Mac 上):
echo -e "ABC123\nACDEG12\nAR123456\nC001\nABC\n123" > file.txt
您原来的 sed 命令有 3 个问题:
\([^0-9-]\)
+
和 \+
默认在 Mac sed 上工作,因为默认情况下它使用基本的正则表达式。\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