我想查找一个段落是文件列表。例如,一条 SQL 语句如下:
upadte b_table
set number = 100014
where id in (
select number_desc from t_table
where id > 100);
我应该如何忽略输入/换行?
我需要查找/打印以“更新”开头并以第一次出现的;
答案1
受到 barryj 的简洁 awk 解决方案的启发:
perl -ne 'print if /update/../;/' *.sql
如果更新语句包含在(空行分隔的)段落中:
perl -00 -ne 'print if /update.*?;/' *.sql
- 从http://uselessuseofcat.com/?p=381
否则,这将打印文件名和更新语句:
perl -ne 'BEGIN{undef $/}; print "$ARGV\t$.\t$1\n" if m/(update.*?;)/mg' *.sql
- 从http://www.commandlinefu.com/commands/view/5087/multi-line-grep
(未经测试 - 买家自负)
答案2
grep 对于换行符有点棘手,但你可以尝试使用 awk:
awk '/update/,/;/' < filename.sql
答案3
我像这样使用 grep:
grep -ihRP '^(update|( )* update) .* [^;]*;'