![我的 sed 表达式不起作用](https://linux22.com/image/1287619/%E6%88%91%E7%9A%84%20sed%20%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我想使用sed
注释掉 js 文件中的某个命令。该命令名为processLoad(..)
。我想出了下面的表达式,但它并没有按照我的预期执行。我使用的计算机属于我的提供商,所以我不知道机器上运行的 Linux 版本。
sed -r -i 's_^\([ \t]+processLoad.*\)$_//\1_' test.txt
我希望替换一行:
processLoad('mystr');
进入
// processLoad('mystr')
我发现/
作为替代分隔符会给作为注释带来问题//
,因此我选择_
作为替代分隔符。
答案1
尝试sed '/^[[:space:]]*processLoad/s!^!//!'
第一部分/^[[:space:]]*processLoad/
将操作限制为仅与该模式匹配的行。第二部分s!^!//!
是 sed 著名的搜索和替换:找到行首 (^) 并用两个斜杠替换。我使用感叹号 ( s!!!
) 代替典型的斜杠,这样我就不必费心转义替换字符串中的文字斜杠。有关更多详细信息,请参阅sed
手册页。
答案2
您需要扩展正则表达式标志(-r)吗?
使用此标志,您的正则表达式将尝试匹配文字(和)而不是存储匹配。
基本正则表达式和扩展正则表达式之间的唯一区别在于几个字符的行为:“?”、'+'、圆括号和大括号(“{}”)。虽然基本正则表达式要求对它们进行转义才能使它们表现为特殊字符,但使用扩展正则表达式时,如果希望它们与文字字符匹配,则必须对它们进行转义。
答案3
如果 processLoad 出现在行首,您或许应该将 + 改为 *。
如果 processLoad(...) 可以出现在一行的中间,那么您将需要一个相当不同的表达式。
答案4
下面的表达式解决了这个问题,对我来说,它可以在 debian linux 和 mac os x (bsd) 上运行,尽管需要\1
用 替换$1
。sed 在不同平台上的差异很大,这有点令人恼火。
`sed -e 's_^\([ \t]*processLoad(\)_//\1_' -i -- test.txt