0

这类似于在找到匹配项时使用 sed 替换行首,但问题不同,因此有此线程。

我希望取消注释掉注释掉的代码。更具体地说,所有变量 myVar 被注释掉的情况。

例子:

public class MyClass {
   ...
   ...
   //myVar.setAge(200);
   //myVar.setPlanet("mars");
}

public class MyClass {
   ...
   ...
   myVar.setAge(200);
   myVar.setPlanet("mars");
}

正则表达式:

^\\.*myVar.*$

得到我需要的一切。

棘手的部分是获得正确的 Sed。我尝试:

sed 's/(^\\)(.*myVar.*$)/\2/g' Build_DM_Digests_Batch.cls

在以下基础上。创建两个匹配组。第一个是注释掉的行。第二个是线路的其余部分。仅用第二个匹配组替换整行。

这给出了错误:

sed: -e expression #1, char 29: Unmatched ) or \)

有小费吗?

4

3 回答 3

2

利用sed 's/^\( *\)\/\/\(.*myVar.*$\)/\1\2/' file

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

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

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

解释:

^      # Matches the start of the line
\(     # Start first capture group  
 *     # Matches zero or more spaces
\)     # End first capture group
\/\/   # Matches two forward slashes (escaped)
\(     # Start second capture group 
.*     # Matches anything 
myVar  # Matches the literal word 
.*     # Matches anything
$      # Matches the end of the line
\)     # End second capture group 

在这里,我们将空格捕获到//,然后在 if 之后myVar的所有内容并替换为\1\2

您的逻辑几乎就在那里,但是有几件事,首先是转义了所有括号,其次您^( *)\/\/不希望^\\在行首捕获两个转义的正斜杠,其中的空格不是两个反斜杠:

如果您不想转义括号,则需要使用扩展的正则表达式标志,sed它的-rfor GNU sedonOSX它是-E这样检查的sed --help

sed -r 's/^( *)\/\/(.*myVar.*$)/\1\2/' file

注意:当您匹配整行(从^$)时,该g标志是多余的。

于 2013-01-03T11:27:43.173 回答
0

另一种方式:

sed 's!^\([ \t]*\)//\(.*\<myVar\>\)!\1\2!' input
于 2013-01-03T11:39:19.503 回答
0

克里斯的回答和解释是有效的。但是,我想添加一个更清晰的等效表达式。这个表达式依赖于两个变化

  • 将分隔符更改为不包含在正则表达式中的任何字符,例如|,去掉转义字符/
  • 指定扩展正则表达式 ( -r) 可以消除括号的转义()

这会产生一个可读的命令,其意图更清晰,更接近您预期使用的内容。

sed -r 's|^( *)//(.*myVar.*$)|\1\2|' filename
于 2020-01-17T14:05:20.967 回答