Regex替换上下文中的字符串,但不替换上下文中的字符串

Regex替换上下文中的字符串,但不替换上下文中的字符串,regex,linux,bash,replace,sed,Regex,Linux,Bash,Replace,Sed,我不熟悉regex,希望执行以下任务: 我有一个字符串说,JOHN.S,我想用tab替换句点。但是,仅当周期介于两个字母之间时,才应进行替换。我不想让它发生的事情是用一个标签代替约翰,S.中的句号。相反,我将只使用一个选项卡来替换,,我知道如何做 如果我尝试替换/[a-zA-Z]\.[a-zA-Z]/,则周围的字母将被删除,但显然我希望保留它们。它们应该只用于识别上下文 我找了很长时间,但没有找到解决办法。更具体地说,我使用的是bash。所以我可能会使用sed 多谢各位 只需用()捕捉周围的信息

我不熟悉
regex
,希望执行以下任务:

我有一个字符串说,
JOHN.S
,我想用tab替换句点。但是,仅当周期介于两个字母之间时,才应进行替换。我不想让它发生的事情是用一个标签代替约翰,S.中的句号。相反,我将只使用一个选项卡来替换
,我知道如何做

如果我尝试替换
/[a-zA-Z]\.[a-zA-Z]/
,则周围的字母将被删除,但显然我希望保留它们。它们应该只用于识别上下文

我找了很长时间,但没有找到解决办法。更具体地说,我使用的是
bash
。所以我可能会使用
sed


多谢各位

只需用
()
捕捉周围的信息,然后用
\1
\2
等将其打印回来:

sed -r 's/(\w)\.(\w)/\1\t\2/g' file
使用您的语法:

sed -r 's/([a-zA-Z])\.([a-zA-Z])/\1\t\2/g' file
试验
这在mac上不起作用。。。我没有
-r
选项,在检查手册后,我发现
-E
应该用于扩展正则表达式。但是,使用
\w
进行匹配没有任何效果。使用
[a-zA-Z]
将留下这一行:
JohntS
而不是
John(tab)S
。我的
sed
是BSD 2005年5月版。那么你可以去掉
-r
,使用
\(
\)
捕捉组:
sed's/\([a-zA-Z]\)\([a-zA-Z]\)/\1\t\2/g'文件
。这仍然打印
JohntS
。如果我将
\t
替换为
\\t
,它将按字面意思打印
John\tS
。你知道那里发生了什么吗?哦,我刚想出来。似乎我需要一个文本选项卡(使用
Ctrl-V tab
输入)。那么它是正确的。很高兴读到它,我想它会成功的。如果您完成了,您可以将答案标记为已接受。
$ cat file
John, S.
JOHN.S
blabla

$ sed -r 's/(\w)\.(\w)/\1\t\2/g' file
John, S.
JOHN    S
blabla