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

SELECT
        *
FROM
        [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]

Вы также можете посмотреть на использование связанных серверов. Связанными серверами могут быть и другие типы источников данных, такие как платформы DB2. Это один из способов попыток доступа к DB2 с помощью SQLQL TSQL или Sproc call ...

-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
поделиться
Другие вопросы по тегам:

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