我有以下字符串。我想找到一行中第一个出现的数字,使用此匹配项来替换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
答案 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
答案 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);
$