изменение шаблона текстового файла

Рабочая "конфетка устанавливает openssl-devel", кажется партией, легче, чем переключение на человечность.

Имел ту же проблему как OP. У меня был установленный openssl, но nginx мог найти его, когда compil, но указатель на libssl-devel помог мне

3
23.02.2012, 12:49
5 ответов

Один способ использовать sed:

Содержание script.sed:

## Change line.
s/.*/('&','&')/

## Append it to hold space.
H

## In end of file substitute newlines with commas and print.
$ {
    g   
    s/^\n//
    s/\n/,/g
    p   
}

Команда:

sed -nf script.sed infile

Вывод:

('chair','chair'),('table','table'),('pen','pen'),('desk','desk')
3
27.01.2020, 21:10

Никакая потребность в подпроцессе, это может быть сделано в чистой оболочке удара:

var=$(while read line; do echo -n ",('$line','$line')"; done < file)
var=${var:1}

Обновление:

Если Вы хотите это как остроту, Вы могли:

var=$({ read line && echo -n "('$line','$line')" && while read line; do echo -n ",('$line','$line')"; done } < file)

Отметьте && работать echo и whileтолько это файл непусто.

2
27.01.2020, 21:10
  • 1
    ++++ 1 это выглядит хорошим и коротким –  munish 23.02.2012, 14:44
  • 2
    Привет @jfgagne, но первая запятая прибудет, и вывод будет запуском что-то как, (......... –  munish 23.02.2012, 15:22
  • 3
    Да, 1-е желание запятой прибудет из 1-й команды. Поэтому необходимо добавить var=${var:1} как 2-я команда для чередования 1-го символа. Я думаю, что легче продолжиться тот путь, чем управлять 1-й строкой по-другому, но я обновлю сообщение. –  jfg956 23.02.2012, 20:55

Вот чистый метод оболочки: считайте каждую строку и добавьте правильно массажировавшие данные к var. Снимите изоляцию с дополнительной запятой.

var=
while IFS= read -r line; do
  var="$var,('$line','$line')"
done <input_file
var=${var#,}

Вот простой метод с помощью внешних утилит: массаж каждая строка с sed, затем превратите новые строки в запятые. Снимите изоляцию с дополнительной запятой.

var=$(<input_file sed "s/.*/('\1','\1')/" | tr "\n" ',')
var=${var%,}
2
27.01.2020, 21:10

Здесь решение не с awk, но с sed:

Чтобы сделать замену в ИМЕНИ ФАЙЛА, работать

sed ':a;N;$!ba;s/\n/,/g;s/\w*/(''&'',''&'')/g' -i FILENAME

Для получения дополнительной информации посмотрите этот вопрос.

1
27.01.2020, 21:10
  • 1
    благодарит за предложение, но это не сделало run.it, дал –  munish 23.02.2012, 12:48
  • 2
    $ sed ':a;N;$!ba;s/\n/,/g;s/\w*/(''&'',''&'')/g' -i csclm.txt sed: The label :a;N;$!ba;s/\n/,/g;s/\w*/(&,&)/g is greater than eight characters. –  munish 23.02.2012, 12:48
  • 3
    +1 мне нравится Ваш ответ так или иначе, я собираюсь изучить его. Это - шаг в правильном направлении –  munish 23.02.2012, 13:00
  • 4
    Для меня, это работает без любых проблем. Я попробовал его GNU sed 4.2.1 и zsh/bash как оболочка. –  jofel 23.02.2012, 13:32
  • 5
    Вы, кажется, использует не-GNU sed. Согласно этому обсуждению, это должно работать на Вас при использовании реальных новых строк вместо ; между командами sed. –  jofel 23.02.2012, 13:40

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

var=$(sed -e "s/^/'/" -e "s/\$/'/" file |
  paste -d "," - <(sed -e "s/^/'/" -e "s/\$/'/" file) |
  sed -e "s/^/(/" -e "s/\$/)/" |
  paste -s -d ",")
1
27.01.2020, 21:10

Теги

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