2016-11-25 3 views
0

Я пишу скрипт с awk, чтобы заменить все двойные кавычки двойной двойной кавычкой для всех файлов в папке.Заменить двойную цитату с двойной двойной цитатой с 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

Как выглядит ваш входной файл? '$ f3' содержимое? – Inian

+0

Привет, спасибо за ваш ответ 01 ## "hello world" 98 ## –

+1

, если вы в порядке с 'sed'' sed 's/"/ &&/g' inputfile' –

ответ

5

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

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

Не нужно ничего более увлекательного.

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

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 
0

Изменение цикла для

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

@EdMorton: Право ... В Код OP, он начинался с 0. Таким образом, он заменял дважды, как я уже упоминал ... – anishsane

2

Просто потерять петлю т.д.,:

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

Читать книгу Эффективное программирование Awk, 4-е издание, автор Arnold Ro bbins.

Смежные вопросы