Grep 多个 sql 文件中的 appsand(&) 及其后面的单词(变量名称)

Grep 多个 sql 文件中的 appsand(&) 及其后面的单词(变量名称)

我正在尝试 grep 多个 SQL 脚本以获取&"variable name".例如,如果我有两个文件intl_reg.sql和,文件trans_by_detc.sql中的变量为intl_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

GNU grep:

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

正则表达式匹配如下:

节点 解释
^ 字符串的开头
& &
\K 重置比赛的开始(什么是Kept)作为使用后视断言的更短替代方案:环顾四周正则表达式中对 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

相关内容