クエリを動作させようとして数時間努力した最後に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もあります。これはまだ貪欲ですが、一致しません(
。つまり、次までのすべての文字と一致します(
。この技術は.*
制限的な特性を割り当てることによって貪欲を制限します。
答え2
新しい行とタブを追加するために、GNUを使用して関数、サブ最初の開いている括弧で始まる行と一致します。sed
$ sed '/^function/s/(/&\n\t/' input_file
function foo(
bar=array())
答え3
要件を正確に満たすために、関数識別子[1]は(英数字、下線、またはハイフン)文字です。
sed -E 's:function[[:blank:]]+[[:alnum:]_-]+\(:&\n\t:' file`
何もキャプチャする必要はありません。 「function」を開くかっこに一致させ、&
置換文字列から一致するテキストを引用するために使用します。
[1]多くの言語では識別子を制限しますが、最初の文字は文字または下線に制限されています。