Заменить двойную кавычку на двойную двойную кавычку на awk

Я пишу скрипт с awk, чтобы заменить все двойные кавычки двойной двойной кавычкой для всех файлов в папке.

Я нашел это в stackoverflow, но получил другой результат

awk 'BEGIN{FS=OFS="#"} {for (i=0;i<=NF;i++) gsub(/"/, "&&",$i)} 1 $f3 > $f2

вывод для этого примера примера:

01##"hello world"98##

is

01##""""hello world""""98##

И я хотел бы получить

01##""hello world""98##

person Houssem Hariz    schedule 25.11.2016    source источник
comment
Как выглядит ваш входной файл? $f3 содержимое?   -  person Inian    schedule 25.11.2016
comment
Привет, спасибо за ответ 01##hello world98##   -  person Houssem Hariz    schedule 25.11.2016
comment
если у вас все в порядке с sed sed 's/"/&&/g' inputfile   -  person P....    schedule 25.11.2016


Ответы (3)


Чтобы заменить все двойные кавычки двумя двойными кавычками, используйте sed:

sed 's/"/""/g' file

Нет необходимости в чем-то более причудливом, чем это.

Чтобы сделать это для всех файлов в каталоге, используйте параметр на месте, если ваша версия sed поддерживает его:

sed -i.bak 's/"/""/g' *

Это создает резервные копии каждого файла с суффиксом .bak.

Если вы не можете использовать -i, используйте цикл с временным файлом:

for i in *; do 
    sed 's/"/""/g' "$i" > tmp && mv tmp "$i"
done

Или всегда есть старый добрый ed:

for i in *; do
    ed -s "$i" <<< $',s/"/""/g\nw'
done
person Tom Fenech    schedule 25.11.2016

Просто потеряйте петлю и т.д.:

$ echo '01##"hello world"98##' | awk '{gsub(/"/,"&&")}1'
01##""hello world""98##

Прочтите книгу Арнольда Роббинса «Эффективное программирование в Awk», 4-е издание.

person Ed Morton    schedule 25.11.2016

Измените петлю на

awk 'BEGIN{FS=OFS="#"} {for (i=1;i<=NF;i++) gsub(/"/, "&&",$i)} 1' $f3 > $f2

Когда цикл начинается с 0, он сначала заменяет " на "" для $0 (в этом контексте вся строка), а затем снова для каждого поля.

Но на самом деле вы можете просто сделать его компактным с помощью:

awk '{gsub(/"/,"\"\"");}1' $f3 > $f2

Or

sed 's/"/""/g' $f3 > $f2
person anishsane    schedule 25.11.2016
comment
@EdMorton: Правильно ... В коде OP он начинался с 0. Итак, он дважды заменялся, как я уже упоминал ... - person anishsane; 25.11.2016