Найти шаблон, использовать и заменить другой матч - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующая строка. Я хотел бы найти первое вхождение цифр в строке, используйте это совпадение для замены значений 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", группа захвата}'

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 голосов
/ 18 января 2019

С 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, если замена прошла успешно
  • См. редактирование на месте , если вам нужно изменить сам входной файл
0 голосов
/ 18 января 2019

Вы также можете попробовать 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 голосов
/ 18 января 2019

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

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, если вы хотите выполнить эту операцию для файла Input_file, выполните следующие действия (просто передайте имя файла Input_file в awk script)

awk '
match($0,/\([0-9]+/){
  value=substr($0,RSTART+1,RLENGTH-1)
}
{
  gsub("NULL",value)
}
1' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...