在匹配的文本后添加注释和新行

时间:2015-10-18 19:21:18

标签: unix sed

我的个人资料中有以下内容:

export JAVA_HOME=/usr/bin/java

如何评论此行并在此行后添加新行。

预期结果:

#export JAVA_HOME=/usr/bin/java
export JAVA_HOME=${java_path}

我试过这个

我尝试使用以下sed -e '/export JAVA_HOME=/usr/bin/java/ s/^#*/#/' < file.txt仅在评论不存在的情况下添加评论,但这不是

提前致谢

1 个答案:

答案 0 :(得分:1)

尝试以下操作(假设 GNU Sed ):

sed -r '\|^(export JAVA_HOME=)/usr/bin/java$| {s//#&\n\1${java_path}/}' file.txt

使用 BSD(OSX) Sed (也应该使用GNU Sed),事情会变得复杂一些(假设bash,{{1} }或ksh作为shell,由于使用了zshANSI C-quoted string来生成文字换行符。):

$'\n'

(希望)符合POSIX标准的解决方案(但有点复杂;还假设sed -E '\|^(export JAVA_HOME=)/usr/bin/java$| {s//#&\'$'\n''\1${java_path}/;}' file.txt bashksh作为shell):

zsh

正如您所看到的,不同的sed '\|^\(export JAVA_HOME=\)/usr/bin/java$| {s//#&\'$'\n''\1${java_path}/;}' file.txt 实现需要不同的解决方案,因此,特别是对于sedsed,但是对于一般的Unix实用程序,建议提及一个平台或明确请求跨平台兼容的解决方案。

注意:通常,awk用于在Sed命令中分隔正则表达式,但是可以选择不同的分隔符,如果您想避免必须转义/.../个字符,这将非常有用。在正则表达式本身。在这里,我选择了/ - 请注意开头 |必须| - 转义(您\)选择备用分隔符时要做的事。

至于为什么你的命令s///无效

  • 你忽略了逃离sed -e '/export JAVA_HOME=/usr/bin/java/ s/^#*/#/' < file.txt字符。在正则表达式/中,这是必要的,因为您的Sed地址使用\/作为正则表达式分隔符

  • /在匹配的行中查找零个或多个现有的 s/^#*/#/个字符,并在给定的情况下仅用#替换它们,一个无操作。

    • 如果希望#函数隐式操作上下文地址(选择匹配行的脚本开头的正则表达式)匹配,则必须使用 emtpy 正则表达式,即s,如上述解决方案。
    • 要引用替换文字中的匹配文字,您必须使用s//.../;如果有捕获组,如上面的解决方案,你可以参考他们通过索引捕获的内容:&指的是第一组,...
相关问题