sed は、キーワード、ランダムな単語、および既知の記号を使用して文字列を照合し、書式を再指定します。

sed は、キーワード、ランダムな単語、および既知の記号を使用して文字列を照合し、書式を再指定します。

クエリを動作させようとして数時間努力した最後にsedすぐに放棄しようとしています!

古い文書化されていないコードのプロトタイプを生成する目的で、ソースコードから次の文字列を抽出しました。たとえば、

function foo(bar=1);

同様の結果を得たいと思います。

function foo(
    bar=1)

function 次に、始まるすべての行と任意の英数字(および - および_)の単語を一致させ、改行文字とタブを追加したいと思いますsed

私の問題は、sedが基本的に貪欲でsed正規表現が貪欲であるため、最初の改行の後に改行を追加できないことです。(

したがって、次のようにハードコーディングが機能します。

echo 'function foo(bar=true)' | sed 's:\(function foo(\)\(.*\):\1\n\t\2:g'

これは私に予想される結果を与えます。

function foo(
    bar=true)

文字の後に改行を追加することで、次のように変更できます(

echo 'function foo(bar=true)' | sed 's:\(function.*(\)\(.*\):\1\n\t\2:g'

これは以前と同じ予想結果を提供します。パラメータのデフォルトとして、配列を含むコードから関数に到達するまで、これは貪欲な正規表現が私を混乱させる部分です。

echo 'function foo(bar=array())' | sed 's:\(function.*(\)\(.*\):\1\n\t\2:g'

これは実際には以下を提供します。

function foo(bar=array(
    ))

欲が多い場合は、最後に改行とタブが追加されます。最後 (そして初めてではありません。sed残念ながらいいえすべての問題を即座に解決できる、貪欲でない正規表現をサポートします。

だから、私は次のような正規表現を作ってみましたが、結果は得られませんでした。

  • 's:\(function [\w+]\)\(.*\):\1\n\2:g' 最初(
  • :alnum:クラスを使って単語を一致させてください。
  • sed同じ置換を実行するより使い慣れた方法ですが、パターン内[A-Za-z0-9_-]の複数の文字と一致させる方法を理解するのは難しいので、最初に単語をインポートしてから、2番目の(戻りから残りを取得します。

クエリでは、これらの文字クラスは無視され、アイデアが不足しているようです。

貪欲にならないようにすることができないので、型sedの文字列をどのように一致させることができますか?

KnownKeyword SomethingRandomAlphaNumerical-_(SomethingElse())

文字列に変換すると、最初(、、後の改行文字の後に次のように表示されます。

KnownKeyword SomethingRandomAlphaNumerical-_(
SomethingElse())

私はどこで間違っていますか?どのモデルがこれを達成できますか?

ベストアンサー1

ドットを「すべての文字」として使用しないで、.否定文字の一致を使用してください[^(]。したがって、正規表現は次のようになります。

$ echo 'function foo(bar=array())' | sed 's:\(function[^(]*(\)\(.*\):\1\n\t\2:g'

function foo(
    bar=array())

否定一致は、最初の文字の後の括弧内の文字を除くすべての文字と一致します^(改行文字を除く)。これは、aが[^(]「not」と一致すると理解できることを意味します(。その後、*できるだけ繰り返すことを意味するanもあります。これはまだ貪欲ですが、一致しません(。つまり、次までのすべての文字と一致します(。この技術は.*制限的な特性を割り当てることによって貪欲を制限します。

おすすめ記事