Найти шаблон, использовать и заменить другой матч

У меня есть следующая строка. Я хотел бы найти первое вхождение цифр в строке, используйте это совпадение для замены 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([112],/\([0-9]+/){
      value=substr([112],RSTART+1,RLENGTH-1)
    }
    {
      gsub("NULL",value)
    }
    1' >> converted.sql
done < test.sql
-1
задан muscleman71 18 January 2019 в 14:58
поделиться

3 ответа

Вы также можете попробовать 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);
$
0
ответ дан stack0114106 18 January 2019 в 14:58
поделиться

Не могли бы вы попробовать следующее.

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

Вывод будет следующим.

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

Согласно комментарию OP, если вы хотите выполнить эту операцию для файла Input_file, выполните следующие действия (просто передайте имя файла Input_file сценарию awk)

awk '
match([112],/\([0-9]+/){
  value=substr([112],RSTART+1,RLENGTH-1)
}
{
  gsub("NULL",value)
}
1' Input_file
0
ответ дан RavinderSingh13 18 January 2019 в 14:58
поделиться

С 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 , если вам нужно изменить сам входной файл
0
ответ дан Sundeep 18 January 2019 в 14:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: