查找模式,使用并替换其他匹配项

时间:2019-01-18 14:31:06

标签: regex awk sed

我有以下字符串。我想找到一行中第一个出现的数字,使用此匹配项来替换NULL。

INSERT INTO data VALUES (11,1), (NULL,2), (NULL,3), (NULL,4);

我真的完全不熟悉sed或awk。

所以在上面的示例中,这是我想要的输出。

INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);

这有点像我认为的问题 awk'{sub(/ {digit} /,“ NULL”,capturegroup}'

while read -r line; do
    name="$line"
    echo $line  |  
    awk '
    match($0,/\([0-9]+/){
      value=substr($0,RSTART+1,RLENGTH-1)
    }
    {
      gsub("NULL",value)
    }
    1' >> converted.sql
done < test.sql

3 个答案:

答案 0 :(得分:2)

使用sed(在 GNU sed 4.2.2 上进行了测试,语法会因不同的实现而有所不同)

$ cat ip.txt
INSERT INTO data VALUES (11,1), (NULL,2), (NULL,3), (NULL,4);
foo (42,14), (4,NULL), (5,3), (NULL,14)

$ sed -E ':a s/([0-9]+)(.*)NULL/\1\2\1/; ta' ip.txt
INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);
foo (42,14), (4,42), (5,3), (42,14)
  • -E使用ERE代替默认的BRE
  • :a标签a
  • ([0-9]+)(.*)NULL的第一个数字序列,后跟其他文本,然后是行中最后出现的NULL
  • \1\2\1根据预期输出
  • 如果替换成功,
  • ta分支到标签a
  • 如果您需要更改输入文件本身,请参见sed in-place editing

答案 1 :(得分:1)

请您尝试以下。

echo "INSERT INTO data VALUES (11,1), (NULL,2), (NULL,3), (NULL,4);"  |  
awk '
match($0,/\([0-9]+/){
  value=substr($0,RSTART+1,RLENGTH-1)
}
{
  gsub("NULL",value)
}
1'

输出如下。

INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);

如果要对Input_file执行此操作,则按照OP的注释,然后执行以下操作。(只需将Input_file名称传递给awk脚本)

awk '
match($0,/\([0-9]+/){
  value=substr($0,RSTART+1,RLENGTH-1)
}
{
  gsub("NULL",value)
}
1' Input_file

答案 2 :(得分:1)

您也可以尝试Perl

$ cat muscleman.txt
INSERT INTO data VALUES (11,1), (NULL,2), (NULL,3), (NULL,4);
INSERT INTO data VALUES (22,1), (NULL,2), (NULL,3), (NULL,4);
INSERT INTO data VALUES (33,1), (NULL,2), (NULL,3), (NULL,4);
$  perl -pe ' /(\d+)/ and $x=$1; s/NULL/$x/g ' muscleman.txt
INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);
INSERT INTO data VALUES (22,1), (22,2), (22,3), (22,4);
INSERT INTO data VALUES (33,1), (33,2), (33,3), (33,4);
$

感谢@Sundeep另一个简短的答案!

$ perl -pe '($x)=/(\d+)/; s/NULL/$x/g' muscleman.txt
INSERT INTO data VALUES (11,1), (11,2), (11,3), (11,4);
INSERT INTO data VALUES (22,1), (22,2), (22,3), (22,4);
INSERT INTO data VALUES (33,1), (33,2), (33,3), (33,4);
$