1

これはばかげた質問かもしれませんが、( )sedによってサポートされていますか?私はそれらの間に何があるかを知ってい\\(て保持しているので、あなたはそれを何番でも\\)アクセスできます。\1括弧を探してその間にあるものを保存するには、正規表現が必要です。

sed 's/.*( .* \([[:alnum:]]+\) *).*/\1/' file

だから私はこれを探しています:

おそらくいくつかのもの(おそらくいくつかのもの[文字または数字]おそらくいくつかのもの)

外側()のsを見つける必要がありますが、見つけることができない\か、内側にあるものを保存したいと考えています。基本的に私はsを見つけるだけでよい()ので、それらの中にいくつかのものを保存することができます。

私はこれを行う方法を探し続けるつもりですが、もしあなたの誰かがそれが本当に私を助ける方法を知っているなら。とを使用してみ""まし''たが、機能しないある種の誤った構文を使用しない限り。あなたが提供できるどんな助けにも感謝します。

編集:具体例:欲しい:

    aname = (type name){ value, value }. 

()と{}は他の意味があるので、特にsedで探す方法を知りたいです。\ {と\}が{}を取得する方法だと思いますが、()を取得する方法がわかりません。また、前のsed式ではそれが見つからないこともわかっています。これは、正規表現で()を探したいことを示すために書き留めた簡単な例にすぎません。ご迷惑をおかけして申し訳ございません。これが私の現在の正規表現であることがわかります。

    start line   aname        =          (        type           name    )         { values }; 

    sed 's/^\([[:alnum:]]\)+ *={1} *[^()]({1} *[[:alnum:]]+ +\([[:alnum:]]\)+ *) *\{{1}\(.*\)\};/init_\2\( \&\1, \3)/' file
4

2 に答える 2

3

sed (および Posix Basic 正規表現を使用するその他のユーティリティ) は特別な意味を持たないため、他の文字()同じように使用できます。\(および\)はグループ区切り文字です。

BREは本当に死ぬべきです。ずっと前に、Posix はグループ区切り文字が(andである「拡張」正規表現 (ERE) を定義し、括弧を一致させるためにand)を使用しました。これははるかに直感的です。BRE と ERE のand (数値繰り返し演算子)の扱いにも同様の違いがあります。ERE にはand演算子も含まれます。\(\){}|+

grepどちらもデフォルトでsedBRE を使用しますが、正しいコマンドライン フラグを使用して ERE を使用するように説得することができます:grep -Eおよびsed -r. gawk は、いくつかの GNU 拡張と標準からのいくつかの逸脱を伴う ERE を使用{}ます。[暴言]私たちがこのすべての狂気を容認していることに時々驚かされます。正規表現の標準は 1 つだけにする必要があり、すべてのユーティリティは例外なくそれを使用する必要があります。[/rant]

(とを使用した正規表現)が期待どおりに機能しない場合は、失敗するパターンの具体的な例と、期待される結果を提供してください。私の疑惑は、それが実際に使用しているパターンである場合、パターン内のスペース文字に関係しているということです。

于 2012-09-25T17:33:08.810 に答える
2

あなたの問題は、最初の .* パターンが取る貪欲な一致だと思います。

[^()]* に置き換えて、括弧を除外してみてください:

bash$ echo 'xxx(123)yyy' | sed -e 's/[^()]*(\([[:alnum:]]*\))[^()]*/\1/' ->
123
于 2012-09-25T16:28:21.723 に答える