【问题标题】:sed positional replacement with regular expressionsed 用正则表达式进行位置替换
【发布时间】:2015-04-13 06:49:39
【问题描述】:

我有类似的字符串

SELECT dateAdd(dd,-90, MAX(col_name)) FROM table_123_name

我希望输出为

SELECT MAX(col_name) -90 from table_123_name

我试过了

cat test.txt|sed "s/dateadd(dd,//I g"|sed 's/\(\[select\]\)\([ \s\t]*\)\([0-9-]*\)\(\[,\]\)\([ \s\t]*\)\([A-Za-z0-9(_]*[)]*\)/SELECT \6)\3/I g'

但是正则表达式替换不起作用

【问题讨论】:

  • 这是一个“简单”选择,但是否还有其他选择不考虑,或者与选择的另一个字段具有几乎相同的结构并且也应该考虑?

标签: shell sed


【解决方案1】:

你可以这样做,

$ echo 'SELECT dateAdd(dd,-90, MAX(col_name)) FROM table_123_name' | sed 's/dateadd(dd,\([^,]*\), *\([^) ]*)\)) *\(.*\)/\2 \1 \L\3/gi'
SELECT MAX(col_name) -90 from table_123_name

i 最后的修饰符有助于进行不区分大小写的匹配,\L\3 将第三个捕获组中存在的所有字符转换为小写。

【讨论】:

    【解决方案2】:

    您可以使用awk 这样做:

    awk '/dateAdd/ {split($2,a,",");print $1,$3,a[2],tolower($4),$5}' file
    SELECT MAX(col_name)) -90 from table_123_name
    

    如果您需要除 /dateAdd/ 之外的其他搜索条件,只需将其更改为您需要的条件即可。

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2018-08-22
      • 2012-06-18
      • 2013-08-25
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多