Добавление текста в строки, НЕ соответствующие шаблону

У меня была такая же проблема, и в конце концов я нашел это :https://github.com/systemd/systemd/issues/7074

Я испробовал всевозможные уловки, но, в конце концов, все исправилось просто:

sudo apt-get install nscd

Вот что говорит «apt -cache show nscd»:

Описание -en :Библиотека GNU C :Демон кэширования службы имен Демон, который обрабатывает пароль, группу и поиск хоста. для запуска программ и кэширует результаты для следующего запрос. Вы должны установить этот пакет, только если вы используете медленные сервисы, такие как LDAP, NIS или NIS+.

1
13.11.2021, 08:07
4 ответа

Вы можете сопоставить все строки, НЕ содержащие какую-либо строку, и добавить запятую:

sed '/.*VALUES.*\|.*INSERT.*\|);$/! s/$/,/' your_file

Это работает следующим образом:

  • Я сопоставляю любые строки, содержащие VALUES, INSERTили заканчивающиеся на );.
  • Это делается путем объединения различных строк с помощью \|.
  • Затем они «отменяются» с помощью !(, поэтому только строки, НЕ содержащие эти строки действительно совпадают ).
  • Затем я добавляю запятую к этим строкам.

Убедившись, что он делает то, что вам нужно, просто добавьте -i, чтобы выполнить замена в -месте:

sed -i '/.*VALUES.*\|.*INSERT.*\|);$/! s/$/,/' your_file

Редактировать

Как указал @they в комментариях ниже, эта команда также поместит запятая в последней строке каждого оператора INSERT (Я не уверен, что это проблема для вас):

INSERT INTO `db`.`table`
VALUES (
 39741633,
 .
 .
 .
  29,
  NULL,  <--- unecessary comma here
);
3
13.11.2021, 11:12
sed -i '/INSERT INTO/{n;n;s/$/,/}' teststring.txt 

Пропустил вариант -i,эта команда SED добавила запятую в конце второй строки после INSERT INTO. Я могу делать то, что хочу, но мне пришлось многократно запускать эту команду для 10 строк, увеличивая n;в каждой команде, чтобы следующая команда для третьей строки была

`sed -i '/INSERT INTO/{n;n;n;s/$/,/}' teststring.txt`.

Здесь их три n;, а в первой команде их было два n;.

Буду признателен, если у кого-нибудь есть лучший способ сделать это :-).

0
13.11.2021, 11:12

Поскольку у нас есть постоянное количество значений (строк )для вставки, мы можем подсчитать их и добавить запятую ко всем, кроме последней:

awk 'i>0 {i--; $0 = $0 ","} /^VALUES/ {i=11} 1' datafile.txt

На самом деле в этой awkпрограмме три оператора. Вы можете переписать это так, распределив на несколько строк. (Все строки в программе применяются по порядку к каждой строке ввода.)

awk '
    i>0 { i--; $0 = $0 "," }    # If we are counting, decrement the counter and append comma
    /^VALUES/ { i=11 }          # "VALUES" resets the counter for 12 values/rows
    1                           # Print the current line
' datafile.txt

Пример вывода (первая строфа)

INSERT INTO `db`.`table`
VALUES (
 39741633,
 49302045,
 0,
 44,
  '{"CustomerName":"S","CustomerMobile":"8","CustomerEmail":"","VersionId":"5","CityId":"2","CampaignId":"1","InquirySourceId":"3","Eagerness":"-1","ApplicationId":"2","BranchId":"3","AssignedDealerId":"2","DMSInqNo":"45"}',
  NULL,
  0,
  '2021-11-09 19:11:50',
  NULL,
  1,
  29,
  NULL
);
0
14.11.2021, 18:07

Вы можете использовать двухстрочное -пространство шаблона, и добавьте запятые ко всем строкам, которые не используйте INSERT или ); И из-за 2 строк в пространстве шаблона строка вокруг INSERT и ); тоже не добавляются.

sed -e '
  $!N;/INSERT\|);$/!{s/\n/,&/;P;D;}
' file
0
15.11.2021, 05:50

Теги

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