找到匹配时使用sed替换行的开头

时间:2013-01-03 10:48:26

标签: regex sed

我有一个Java文件。我想评论包含匹配的任何代码行:

 myvar

我认为sed应该帮助我

 sed 's/myVar/not_sure_what_to_put_here/g' MyFile.java

我不知道该放什么:

not_sure_what_to_put_here

就像在这种情况下,我不想替换myVar但我想插入

//

到myVar出现的任何行的开头。

任何提示

3 个答案:

答案 0 :(得分:39)

捕获包含myvar的整行:

$ sed 's/\(^.*myvar.*$\)/\/\/\1/' file

$ cat hw.java
class hw {
    public static void main(String[] args) {
        System.out.println("Hello World!"); 
        myvar=1
    }
}

$ sed 's/\(^.*myvar.*$\)/\/\/\1/' hw.java
class hw {
    public static void main(String[] args) {
        System.out.println("Hello World!"); 
//        myvar=1
    }
}

使用-i选项将更改保存在文件sed -i 's/\(^.*myvar.*$\)/\/\/\1/' file中。

说明:

(      # Start a capture group
^      # Matches the start of the line 
.*     # Matches anything 
myvar  # Matches the literal word 
.*     # Matches anything
$      # Matches the end of the line
)      # End capture group 

因此,这将查看整行,如果找到myvar,则结果存储在第一个捕获组中,称为\1。因此,我们将整行\1替换为前面带有2个正斜杠//\1的整行,当然forwardslashes需要转义为不要混淆sed所以\/\/\1还要注意括号除非使用sed的扩展正则表达式选项,否则需要转义。

答案 1 :(得分:3)

尝试:

sed -n '/myVar/{s|^|//|};p' MyFile.java

表示:当某行包含myVar时,请将该行的开头替换为//

答案 2 :(得分:2)

我正在研究相同的主题,并发现这个解决方案在正则表达式方面更简单

sed -e '/myvar/ s/^/\/\//' file

这会将//添加到具有匹配模式的行的第0列。

但是,我正在寻找一种解决方案,它允许我在行的第一个字符之前添加一个字符(而不是在第0列)。