0

文字列に適用される置換関数内で RegEx を使用して、最初のものを除く部分文字列のすべてのインスタンスに一致させるにはどうすればよいですか?

たとえば、最初の文字列を除くすべての「a」を置き換えると、次のようになります。

a b a c b a a b

私は手に入れたい:

a b c b b

私の実際の使用例は、.js ファイルの束を 1 つに連結する Ant を使用してプロジェクトを構築していることです。各 JavaScript ファイルは「use strict」で始まります。この宣言が必要なのは 1 回だけなので、最初の部分を除いて、この部分文字列のすべてのインスタンスを削除したいと考えています。

4

3 に答える 3

1

一般的な正規表現は次のとおりです。

echo "a b a c b a a b" | perl -pWe 's/(?<=(a))(.*?)\1/$2/g'

後読みを使用して、一致したパターンが文字列の最初にあるかどうかを確認します。(基本的に、私が念頭に置いていたのは でしたがs/(?<=(a).*?)\1//g、可変長の後読みは広く実装されていないようです)。欠点があります-次のような出力が生成されます

a b  c b   b

それをきれいにするために、あなたは使うことができます

echo "a b a c b a a b" | perl -pWe 's/(?<=(a\s))(.*?)\1/$2/g'

aしかし、それは入力の最後を削除しませんa b a c b a a

于 2012-09-17T14:11:08.310 に答える
0

のすべての出現を削除して"use strict";から、最初にもう一度追加します。

編集:例:

  1. sed '/"use strict";/d' < infile > outfile
    

    になる

    (echo '"use strict"'; sed '/"use strict";/d') < infile > outfile
    
  2. perl -nie 'print unless /"use strict";/;' file
    

    になる

    perl -nie 'BEGIN { print qq["use strict";\n]; } print unless /"use strict";/;' file
    
于 2012-09-16T23:37:15.533 に答える
0

あなたの例を解決するには、否定的な先読みアサーションを使用できます。

echo "a b a c b a a b" | perl -pe 's/(?!^)a //g'

結果:

a b c b b

プロジェクトの問題を解決するには (use strict連結ファイルの各行で複数回発生しないと仮定します)、GNU sed最初の行を除くすべての発生を削除するために使用できます。

sed '0,/$/!s/use strict//g' file.txt 
于 2012-09-16T23:41:18.323 に答える