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

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

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

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

01##"hello world"98##

Является

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

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

01##""hello world""98##
0
Houssem Hariz 25 Ноя 2016 в 17:09

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
5
Tom Fenech 1 Дек 2016 в 12:06

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

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

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

2
Ed Morton 25 Ноя 2016 в 16:04

Измените цикл на

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

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

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

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

Или же

sed 's/"/""/g' $f3 > $f2
0
anishsane 26 Ноя 2016 в 03:24