Regex 找到匹配项时使用sed替换行首

Regex 找到匹配项时使用sed替换行首,regex,sed,Regex,Sed,我有一个Java文件。我想对包含匹配项的任何代码行进行注释: myvar 我想塞德应该帮我 sed 's/myVar/not_sure_what_to_put_here/g' MyFile.java 我不知道该放什么进去: not_sure_what_to_put_here 在本例中,我不想替换myVar,但我想插入 // myVar出现在任何行的开头 任何提示都可以尝试: sed -n '/myVar/{s|^|//|};p' MyFile.java 这意味着:当一行包含myVa

我有一个Java文件。我想对包含匹配项的任何代码行进行注释:

 myvar
我想塞德应该帮我

 sed 's/myVar/not_sure_what_to_put_here/g' MyFile.java
我不知道该放什么进去:

not_sure_what_to_put_here
在本例中,我不想替换myVar,但我想插入

//
myVar出现在任何行的开头

任何提示都可以尝试:

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

这意味着:当一行包含
myVar
时,将该行的开头替换为
/

捕获包含
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的/\(^.*myvar.*$\)/\/\/\/\1/'文件中的更改

说明:

(      # 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
替换为前面有两个正斜杠的整行
/\1
当然,正斜杠需要转义,以免混淆
sed
所以
\/\/\1
还请注意,括号需要转义,除非您使用
sed
的扩展正则表达式选项

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

sed-e'/myvar/s/^/\/\/'文件

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


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

我在windwons上,|变为|,我得到:“|”不被识别为内部或外部命令,好的,那么您必须使用转义斜杠:
sed-n'/myVar/{s/^/\/};p'MyFile.java
或者,如果操作系统没有提供引用文本字符串的方法,则将脚本放入文件中。不过,也许双引号而不是单引号会起作用。这看起来不错。你能解释一下你答案的逻辑吗?i、 e./(^.*etc做什么?太棒了!我只是想理解,而不仅仅是完成事情。答案很好。在一个单独的正则表达式中,我想检测行尾,我正在使用
sed-i“s/cb$i$/cb$i$cb/”*/callback\u events
。但是我发现变量名必须包含字母数字字符的错误。
。你能帮我吗?到目前为止,下面的两个答案都可以帮你。我想提醒你,你必须改进你的模式“myvar”,以避免发生意外的替换。例如,所有包含“myVariable或myVarList或myVarMap或Object obj=new Object;//myVar in comment”将被注释掉。@这是一个很好的观点。它应该尽可能的紧凑。