【问题标题】:How to use sed to replace partial of a find如何使用 sed 替换部分查找
【发布时间】:2014-02-18 12:20:36
【问题描述】:

文件中的某些行如下所示:

 LOB ("VALUE") STORE AS SECUREFILE "L_MS_WRKNPY_VALUE_0000000011"(
 LOB ("INDEX_XML") STORE AS SECUREFILE "L_HRRPTRY_INDX_L_0000000011"(

我可以假设的是,在 "*" 中,字符串以 L_ 开头,以 10 个字符数结尾。

我希望每一行:

  1. LOB 开头(LOB 之前的空格)
  2. ""里面的前两个字母是L_
  3. 行总是以"( 结尾

"" 中的最后 10 个字符替换为变量。

我所能做的就是: cat /tmp/out.log | sed 's/_[0-9_]*/$NUM/g' > /tmp/newout.log

要查找我运行的所需行: grep "^ LOB" create_tables_clean.sql | grep "\"L_"

但是我不知道如何将两者结合起来得到我想要的。

【问题讨论】:

    标签: regex linux bash sed grep


    【解决方案1】:
    sed -r 's/(\sLOB.*"L_.+_)([0-9]{10})("\()/\1'$myVar'\3/'
    

    显然,用您的变量替换 $myVar

    我做了三个捕获组:

    (\sLOB.*"L_.+_)  #catches everything until the 10 numbers
    ([0-9]{10})      #catches the 10 numbers
    ("\()            #catches the last "(
    

    仅当您的行以 LOB 开头(前面有一个空格)并包含 "L_ 时,第一个捕获组才匹配。
    然后,您只需将第二个捕获组(仅包含 10 个数字)替换为您的变量,同时保留第一个和第三个捕获组 (\1'$myVar'\3)。

    你的整个通话看起来像

    cat /tmp/out.log | sed -r 's/(\sLOB.*"L_.+_)([0-9]{10})("\()/\1'$NUM'\3/g' > /tmp/newout.log
    

    (注意我在正则表达式中添加了g-修饰符,所以它会匹配每一次出现)

    【讨论】:

    • 顺便说一句,您在(\sLOB.*"L_.+_)之前缺少^
    • @nir 我省略了^,因为看起来每个LOB ... 都有自己的行。当然,如果单行有嵌套,则需要添加^
    【解决方案2】:

    接受的 sed 命令中有几个无用的字符,这里是较短的一个。

    sed -r 's/(LOB.*"L_.*)([0-9]{10})("\()/\1'$myVar'\3/' file
    

    其次,@Basti M,当您需要在字符串中使用双引号回显时,请使用单引号,那么您无需转义双引号。

    echo 'LOB ("VALUE") STORE AS SECUREFILE "L_MS_WRKNPY_VALUE_0000000011"('
    

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2016-11-27
      • 2017-09-12
      • 2018-10-01
      • 2019-11-29
      • 2017-11-11
      相关资源
      最近更新 更多