2017-08-03 11 views
2

私は多数のマークダウンファイルを持っています。これらのファイルには、私は、だから私は、私はRegExr websiteでテストするときに、この作品Regex `## Example [^] + ### Response`は一致しません

$&New 

に交換する

## Example[^]+### Response 

を使用しようと### ResponseNew

### Response 
I don't want to replace this Response above to ResponseNew since it is not following Example 

## Example 
### Request 
123{}``` 

### Response 
I want to replace this Response above to ResponseNew since it is following Example 

に一定の### Responseを交換したいです。

しかし、検索と置換するサブライムを使用して、それがエラーを示しています

Unmatched [ or [^ in character class declaration. The error occurred while parsing the regular expression fragment: '# Response>>>HERE>>>'. in regular expression ## Example[^]+### Response

私もthis次の端末でPerlを使用しようとした、

find . -type f -exec perl -p -i -e "s/## Example[^]+### Response/$&New/g" {} \; 

それは示しています

Unmatched [ in regex; marked by <-- HERE in m/## Example[ <-- HERE ^]+### Response/ at -e line 1.

正規表現を正しく書くことができますか?おかげ

+1

'[^]'イディオムはPerlには存在しません。 –

+0

RegexrはPerlの正規表現構文をサポートしていません。 JavaScriptの正規表現をテストすると便利です。 –

+0

[^]の代わりに使用できる他のRegexはありますか?ありがとう –

答えて

1

ファイルが提供された入力で正しい出力を出力するもの

perl -0777 -wpe's/## Example.*?### Response\K/New/sg' markdown.txt 

あまり大きくない場合。

/s修飾子を使用すると、.も改行文字と一致し、\Kは前のマッチを削除して、それらを「置き換える」必要がなくなります。それでは、一致するとすぐにResponseNewをタックします。 -0777スイッチを使用すると、ファイル全体が複数の行を処理するために必要な$_にスラップされます。

### Response場合は、行の途中で来るかもしれないと/m修飾子は、文字列全体だけでなく、各ラインの^マッチ始まりを、作るどこそこ

perl -0777 -wpe's/## Example.*?^### Response\K/New/smg' markdown.txt 

それに触れることをしたくありません。ファイルが変数に読ま大きすぎある場合## Exampleが発見され、その後、一度### Responseはそれを交換し、解除フラグ(フラグ真で)発見されたとき


は、フラグを設定します。

これはオンライナーでは実現可能ですが、必要があれば簡単なスクリプトをお勧めします。

+0

ヒントをありがとう! –

1

行単位とスラップモードの間で、独自のレコード区切り文字を定義して## Exampleを選択することもできます。

perl -pe'BEGIN{$/="## Example"} s/### Response\K/New/ if $a++' file 
+0

あまりにもありがとう! –

関連する問題