“我的天哪!我以前竟然不知道!”:这条Simply Linux小技巧比我30多年来分享的任何其他技巧都更受感谢 “我的天哪!我以前竟然不知道!”:这条Simply Linux小技巧比我30多年来分享的任何其他技巧都更受感谢

“我的天哪!我以前竟然不知道!”:这条Simply Linux小技巧比我30多年来分享的任何其他技巧都更受感谢

正则表达式今天我要分享一个改变人生的Linux技巧。

好吧,也许我有点夸张了,但每次我把这个方法展示给别人,他们都会惊呼:“真的吗?!天哪,这简直太简单了!” 理论上来说,任何阅读文档的人都能找到这个方法,因为它并非秘密或未公开的。然而,Unix/Linux 圈子里根深蒂固的传统观念根深蒂固,以至于人们从小就习惯了各种繁琐的操作方式。即使是这周,我和一位从 Linux 诞生之前就开始担任 Unix/Linux 系统管理员的人聊天,他竟然也不知道这个技巧。

这适用于 Linux、BSD 和较早的专有 Unix 系统。几十年前我在 SunOS 上就接触过这种方法,所以它起源于 Unix 的早期阶段。它也适用于 vi/vim、perl 以及几乎所有使用正则表达式的地方。

问题:反斜杠综合症

我举个与文件名有关的例子,但再次强调,这个技巧对于正则表达式是通用的。

假设你在 shell 脚本中有这样一个路径:

一些路径很长

你想把它改成:

 /some/path/new/path

你会怎么做?当然是用正则表达式。我们用 sed 函数。我相信你肯定见过类似这样的代码:

 sed 's/\/that\/is\/long/\/new\/path/'

这样虽然可行,但读起来很混乱,对吧?我们把实际的分隔符用红色标出来:

 sed 's / \/that\/is\/long / \/new\/path / '

不幸的是,因为你使用 / 作为分隔符,所以无论你在哪里使用它,都必须用反斜杠进行转义,这会导致反斜杠过多。

治疗乐队

你知道在正则表达式中可以使用任何字符作为分隔符吗?试试这个:

 sed 's#/that/is/long#/new/path#'

哇!这样读起来是不是容易多了?把上面的红色斜杠替换成八字形符号后,我就不再需要转义斜杠了。

当然,如果你的字符串里全是八字形符号,那就用别的符号代替。你甚至可以用空格代替:

 sed 的 /that/is/long /new/path '

只要三个地方的分隔符相同,任何符号都可以。

你可以用任何正则表达式来实现这个功能。我见过很多人(包括我自己)为了在正确的位置正确使用反斜杠、计算反斜杠的数量而苦恼,也曾因为复杂的正则表达式难以理解而苦恼不已。有了这个技巧,一切都变得简单多了。

享受!