2017-12-11 8 views
1

bashで正しいregexを作成するのに役立つでしょうか?私がする必要がどのようなword-bash正規表現の最初の出現後にマッチが終了する

は次のような構造から、各テーブル定義を抽出することである。

OID: 123 
    Name: tab1 
    CREATE TABLE tab1 (
     ... 
     ); 

    OID: 456 
    Name: tab2 
    CREATE TABLE tab2 (
     ... 
     ); 

    OID: 789 
    Name: tab3 
    CREATE TABLE tab3 (
     ... 
     ); 

1行の形式を準備:

OID: 123 Name: tab1 CREATE TABLE tab1 (...); OID: 456 Name: tab2 CREATE TABLE tab2 (...); OID: 789 Name: tab3 CREATE TABLE tab3 (...); 

私は言葉NameOIDの間のすべてのテキストを取得する必要があります。 私はテーブル名ごとに特定の正規表現を準備する単純なループを書いたが、私はマッチングに問題がある。各表について

は私の正規表現に名前を付けるようなものです:

(Name: tab2 .*?)(OID: .*) 

私の結果は次のとおりです。

Name: tab2 CREATE TABLE tab2 (...) 

私はオンライン正規表現シミュレータで正規表現の上にテストし、それが働いています。私は完全一致から最初のグループを抽出するだけです。 バッチ正規表現では正しくグループ化されていません。バッチは知らないと思う? (先行する要素の0回または1回の出現)。上記の正規表現をbashで使用した結果はありません。

#!/bin/bash 
tables_definition=$(less tables_definition.txt) 
regex="(Name: tab2 .*?)(OID: .*)" 

    if [[ $tables_definition =~ $regex ]]; 
     then 
     object_definition="${BASH_REMATCH[1]}"  

     #do something 
    fi 

助けてください:

私のbashコマンドは次のようなものです。

+0

使用しているbashコマンドを投稿できますか? –

+0

は私の投稿 – MrF

+2

'。*を編集しました。'問題です - POSIX ERE(bashの正規表現が準拠している標準)は非貪欲なグロブを持っていません。 (正規表現エンジンは実際にはbashに組み込まれていませんが、オペレーティングシステムのCライブラリによって提供されるため、実装はプラットフォームごとに多少異なりますが、使用する呼び出しはERE標準を実装する必要があります。プラットフォーム固有の拡張機能)。 –

答えて

1

バッシュの正規表現では、「質素な量指定子」はサポートされていません。

grepとPCREの併用についてはどうですか?

grep -Po '(?<=Name: tab.).*?(?= OID: .*|$)' 

1行の文字列から3つの定義をすべて返します。

+0

私のために働かない。 私は受け取った: 'pcregrep:オフセットでのコマンドライン正規表現でのエラー31:lookbehindアサーションは固定長ではありません。 ' さらに、それらの定義を一つずつ得ることが重要です。だから私はそれをループに入れているのです。 – MrF

+0

@MrF:おそらく '(?<= ...)'の部分で固定長ではないでしょう。 grepから常に定義を読むことができます。 – choroba

1

awkの使い方:

$ awk 'BEGIN{RS="";ORS=OFS=" "}{$1=$1;print}' file 
OID: 123 Name: tab1 CREATE TABLE tab1 (...); OID: 456 Name: tab2 CREATE TABLE tab2 (...); OID: 789 Name: tab3 CREATE TABLE tab3 (...); 

を末尾の改行も(原因ORS=" "に)欠けています。必要に応じて、プログラムの最後にEND{print "\n"}を追加します。

0

Bashソリューション。入力ファイルが一列形式(必ずしも)のテーブル定義を含む:

shopt -s extglob 

    table_definition=$(cat table_definition.txt) 
    table_definition=${table_definition//OID: +([[:digit:]]) Name: tab+([[:digit:]])/} 
    table_definition=${table_definition//; /;\\n} 

    echo -e $table_definition 

第1のパラメータの置換は、第二の一方はすべてのセミコロンに改行を追加し、すべてのOID: xxx Name: tabxを削除します。

出力:

CREATE TABLE tab1 (...); 
    CREATE TABLE tab2 (...); 
    CREATE TABLE tab3 (...); 

入力ファイルには、改行を削除して空白をsqeezeする

table_definition=$(cat table_definition2.txt | tr -d "\n" | tr -s ' ') 

を使用onelinerされていない場合。

関連する問題