如何使用sed替换部分查找

时间:2014-02-18 12:20:36

标签: regex linux bash sed grep

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

 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. 行始终以"(
  4. 结尾

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

显然,将$myVar替换为您的变量。

enter image description here

我制作了三个捕获组:

(\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 - 修饰符添加到正则表达式中,因此它会匹配每个出现的次数)

答案 1 :(得分:0)

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

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

其次,@ Bati M,当你需要在字符串中使用双引号回显时,使用单引号,那么你不需要转义双引号。

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