【问题标题】:sed: add semicolon after each sentencesed:每句后加分号
【发布时间】:2021-11-01 13:39:06
【问题描述】:

我正在使用这个 grep 来从我的日志文件中提取“SQL”语句:

grep -oPzZ ' SQL "\K[^"]+' log.log

之后,我需要在每个检测到的sql语句的末尾添加;来格式化它:

grep -oPzZ ' SQL "\K[^"]+' log.log | sed -E '$s/$/\n/; s/\x0/;/; s/^[[:blank:]]+//'

尽管如此,它似乎根本不起作用。我的意思是,我得到了:

alter table HFJ_RES_LINK modify ( SRC_PATH varchar2(200) );create index IDX_VALUESET_EXP_STATUS on TRM_VALUESET(EXPANSION_STATUS)drop index IDX_VALUESET_EXP_STATUS

如您所见,在第一个检测到的sql语句之后添加了第一个;,之后没有添加。

log.log 类似于:

3_6_0.20180929.1: SQL "alter table HFJ_RES_LINK modify ( SRC_PATH varchar2(200) )" returned 0
4_0_0.20190722.37: SQL "create index IDX_VALUESET_EXP_STATUS on TRM_VALUESET(EXPANSION_STATUS)" returned 0

有什么想法吗?

【问题讨论】:

  • 试试sed -E 's/\x00/;\n/g; s/^[[:blank:]]+//',它should work。

标签: sed


【解决方案1】:

一个简单的sed 可以代替你的grep + sed:

sed -nr 's/.*SQL "([^"]*)".*/\1;/p' log.log

【讨论】:

    【解决方案2】:

    这里最好使用awk,因为您可以将grep 和sed 操作组合成一个命令。考虑这个gnu awk 解决方案:

    awk -v RS='SQL "[^"]+"' 'RT {gsub(/^SQL "|"|\n/, "", RT); print RT ";"}' file
    
    alter table HFJ_RES_LINK modify( SRC_PATH varchar2(200) );
    create index IDX_VALUESET_EXP_STATUS on TRM_VALUESET(EXPANSION_STATUS);
    

    详情:

    • 此awk 命令使用SQL 的自定义记录分隔符,后跟一个空格,然后是双引号字符串。
    • 匹配的文本在内部变量RT 中可用于awk。
    • 当RT 非空时,我们会删除不需要的开头SQL " 和结尾" 以及RT 中的所有换行符,最后以; 结尾打印它。

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 2021-11-19
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      相关资源
      最近更新 更多