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

以下に基づいて。2つのマッチグループを作成します。最初のものはコメント化された行です。そして2番目は残りの行です。行全体を2番目の一致したグループだけに置き換えます。

これによりエラーが発生します:

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 

ここでは、行上にある場合は、までの空白をキャプチャし//、その後のすべてをキャプチャしてmyVar、に置き換え\1\2ます。

ロジックはほぼありますが、最初にすべての角かっこをエスケープし、次に、行の先頭に2つのバックスラッシュではなく、空白をキャプチャした2つのエスケープされたフォワードスラッシュを使用したく^( *)\/\/ない場合があります。^\\

角かっこをエスケープしたくない場合は、その上にある拡張正規表現フラグを使用する必要があるので、でsed確認してください。-rGNU sedOSX-Esed --help

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

注:行全体(from^から$)を一致させる場合、gフラグは冗長です。

于 2013-01-03T11:27:43.173 に答える
0

別の方法:

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

クリスの答えと説明は有効です。ただし、もっとクリーンな同等の式を追加したいと思います。この式は2つの変更に依存しています

  • 区切り文字を正規表現に含まれていない文字に変更すると、たとえば|、のエスケープ文字が削除されます。/
  • 拡張正規表現(-r)を指定すると、括弧のエスケープが削除されます()

これにより、読み取り可能なコマンドが作成され、その意図がより明確になり、使用する予定のコマンドに近くなります。

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