Regex 找到一个模式,使用并替换另一个匹配

Regex 找到一个模式,使用并替换另一个匹配,regex,awk,sed,Regex,Awk,Sed,我有下面的字符串。我想找到一行中第一个出现的数字,用这个匹配替换空的 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 rea

我有下面的字符串。我想找到一行中第一个出现的数字,用这个匹配替换空的

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
读取时-r行;执行
name=“$line”
回声线|
awk'
匹配($0,/\([0-9]+/){
值=substr($0,RSTART+1,RLENGTH-1)
}
{
gsub(“空”,值)
}
1'>>converted.sql
完成
请尝试以下内容

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);
根据OP的注释,如果您想对输入文件执行此操作,请执行以下操作。(只需将输入文件名传递给
awk
script)

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

  • -E
    使用ERE代替默认BRE
  • :a
    标签
    a
  • ([0-9]+)(.*)NULL
    第一个数字序列,后跟其他文本,然后是行中最后出现的
    NULL
  • \1\2\1
    根据预期输出
  • ta
    如果替换成功,分支到标签
    a
  • 查看是否需要更改输入文件本身
您也可以尝试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);
$

通过查看你的个人资料,我知道你从来没有选择任何答案作为正确答案,我建议你找个时间给出答案,并尝试从所有帖子中选择一个正确答案。即使你以前的帖子也可以这样做。事实上,我想问另一个人,我想从一个文件中一行一行地做这个吗line;do name=“$line”echo$line | awk”匹配($0,/([0-9]+/){value=substr($0,RSTART+1,RLENGTH-1)}{gsub(“NULL”,value)}1'完成<测试。sql@muscleman71,请检查我的回答中的附加注释,然后让我知道?如果你是高尔夫爱好者:
perl-pe'($x)=/(\d+)/;s/NULL/$x/g'
@Sundeep很高兴您喜欢它..我将把您的添加到答案中..顺便说一句,我尝试了
perl-pe'/(\d+)/&&s/NULL/$1/g'
为什么它不起作用?。我认为这是因为替代命令将更改
$&
$1
,等等。但是它没有在s//-中引入任何捕获组,所以它不应该更改。有时间请尝试打高尔夫qstn-54242508
$ 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);
$
$ 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);
$