我正在尝试 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 |
重置比赛的开始(什么是K 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