在由未知字符分隔的同一行中多次匹配并替换一个模式

时间:2015-07-14 09:44:19

标签: linux bash perl

给出表格的输入:

select * from foo where ts>@(-2 days) and ts < @(-1 hour)

(这当然只是一个例子。我想支持任何查询构造和@()中的任何表达式

我想将每个@()中的表达式替换为评估date --date=exp +%s的结果,其中'exp'是表达式(因此在上面的示例中结果将是

select * from foo where ts>1436694136 and ts < 1436863336

更一般地说,如何用模式中的捕获作为参数调用shell命令来替换模式?

(我用perl和bash标记了这个问题,但我对任何事情持开放态度)

2 个答案:

答案 0 :(得分:1)

下面的内容(未经测试)

  var ErrArr = [];
  $(document).ready(function () {
    $('#btnSave').click(function (e) {
         e.preventDefault();
         validateTitle();
         validatePrefix();
         validateTextBoxes();
           if(ErrArr.length > 0) {  
             alert(ErrArr.join("\n"));
             ErrArr = [];
             return false;
           }
    });

    function validateTitle() {
        if ($("#ddlTitle").val() > "0") {
            if ($("#ddlTitle").val() == "1104" && $("#txtTitle").val() === "") {
                    ErrArr.push("Please enter the text in other title");

            }

        } else {
             ErrArr.push('Please select the title');

        }           

    }
    function validatePrefix() {
        if ($("#ddlPrefix").val() > "0") {
            if ($("#ddlPrefix").val() == "1110" && $("#txtPrefix").val() === "") {
                ErrArr.push("Please enter the text in other prefix");
            }         


        } else {
           ErrArr.push('Please select the prefix');

        }        

    }
    function validateTextBoxes() {
        if ($("#txtFirstName").val() === "") {
           ErrArr.push('First name is required');

        }
        if ($("#txtMiddleName").val() === "") {
            ErrArr.push('Middle name is required');

        }
        if ($("#txtLastName").val() === "") {
            ErrArr.push('Last name is required');

        }
        if ($("#txtFatherName").val() === "") {
           ErrArr.push('Father name is required');

        }
        if ($("#txtCurrentCompany").val() === "") {
            ErrArr.push('Current company is required');

        }
        if ($("#txtDateofJoin").val() === "") {
            ErrArr.push('Date is required');

        }
        if ($("#txtCurrentExp").val() === "") {
           ErrArr.push('Current Experience is required');

        }           
    }
});

答案 1 :(得分:1)

使用gnu sed:

$ sql_expr="select * from foo where ts>@(-2 days) and ts < @(-1 hour)"

$ sed -r 's|@\(([^)]*)\)|$(date +%s --date "now\1")|g; s|.*|echo "&"|e' <<< "$sql_expr"

Gave:
select * from foo where ts>1436696209 and ts < 1436865409

请注意,此代码假定@(...)的内容是有效的表达式,用于日期计算。

说明:

  1. 第一个表达式会将所有@()个匹配项替换为$(date +%s --date "now _expression_"),其中_expression_将类似于-2 days
  2. 第二个替换表达式在整个字符串&amp;周围添加echo "..." 执行生成的行。您可以删除第二个表达式中的e标志,以找出实际执行的命令。