複数のSQLファイルでGrep appsand(&)とそれに続く単語(変数名)

複数のSQLファイルでGrep appsand(&)とそれに続く単語(変数名)

&"variable name"たとえば、2つのファイルがあり、ファイル内の変数は次のようにintl_reg.sqlなります。trans_by_detc.sqlintl_reg.sql

&campus     
&level  
&ptc    
&visa   
&term   
&sort

ファイルからtrans_by_detc.sql

&detc       
&date1   
&date2   
&credits   

リストを作成し、以下のようなファイルに書きたいです。

intl_reg.sql campus level ptc visa term sort
trans_by_detc.sql detc date1 date2 credits

可能ですかgrep

答え1

そして牛に似た一種の栄養 grep:

$ grep -oP '^&\K\w+' file | paste -sd ' ' -

正規表現の一致は次のとおりです。

説明する
^ 文字列の始まり
& &
\K KLookbehindアサーションを使用して、より短い代替方法で一致開始(ept)をリセットします。周りを見てくださいそして正規表現でKをサポート
\w+ 単語文字(az、AZ、0-9、_)(1回以上(最大限一致))

またはいつものようにgrep

$ grep -o '[[:alnum:]_]\{1,\}' file | paste -sd ' ' -

正規表現の一致は次のとおりです。

説明する
[[:alnum:]_] すべての文字:文字と数字、「_」
\{1,\} 少なくとも一度は

適用対象:

  • ソラリス11
  • FreeBSD 13.1-
  • 忙しい箱
  • ニコス
  • 高山のash
  • ...

出力

campus level ptc visa term sort

完全なOP要件を含める

$ for s in intl_reg.sql trans_by_detc.sql; do
      printf '%s\n' "$s $(grep -o '[[:alnum:]_]\{1,\}' "$s" | paste -sd ' ' -)"
  done
intl_reg.sql campus level ptc visa term sort
trans_by_detc.sql detc date1 date2 credits

答え2

perl -nE '$v{$1}++ while /&(\w+)/g; END{say join " ", sort keys%v}' your-file

&ASCII単語のランダムな位置に続く一意の文字シーケンスのソートされたリストを印刷しますyour-file

sql現在の作業ディレクトリ内のすべてのファイルを処理します。

perl -nE '$a{$1}++ while /&(\w+)/g;
          if (eof) {
            say join " ", $ARGV, sort keys%a; undef %a
          }' ./*.sql

関連情報