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