2016-01-05 2 views
1

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

В GNU Bash (Ubuntu), я пытаюсь только заменить специальные символы, кавычки в файле с именем test.txt, который имеет следующее содержание

foo_bar "foo_bar" 

так, что в результате содержание будет быть

foo_bar "foo bar" 

В настоящее время у меня не было никакой удачи, я попробовал несколько решений, таких как

touch test2.txt 
grep -o '".*"' test.txt | sed s/"_"/" "/g > test2.txt 
rm test.txt 
rename s/"test2"/"test"/ test2.txt 

, который в противном случае был бы прав, но эта команда заставляет содержимое файла быть только «foo bar», а не весь файл. Я ищу способ напрямую заменить цитируемые специальные символы внутри файлов, как sed, так и awk.

ответ

3

Использование AWK:

awk 'BEGIN{FS=OFS="\""} {for (i=2; i<=NF; i+=2) gsub(/_/, " ", $i)} 1' file 
foo_bar "foo bar" 
+0

Что произойдет, если произойдет следующее: 'foo bar" bar \ "baz" '? – andlrc

+1

Не уверен, что экранированные кавычки являются требованиями OP. Если да, тогда ответ необходимо соответствующим образом изменить. – anubhava

+0

Спасибо за все ответы. смог их использовать. – RuneZhevitz

3

С СЕПГ:

sed -ri 's/("[^_]*)_([^_]*")/\1 \2/g' test 
  • -r позволяет расширенные регулярные выражения, так что вам не придется бежать ()
  • -i заменяет входной файл с результатом в -place
  • ("[^_]*) матчи " следуют либо но_ (повторяется ноль или более раз) и захватывает матч
  • ([^_]*") соответствует ничего но_ (повторенные ноль или более раз), а затем " и захватывает матч
  • \1 и \2 являются обратные_связь к захваченным группам
  • g является «глобальным» модификатором: замена повторяется так часто, как это возможно на ту же строку

Это работает только с хорошо выраженными выражениями (четное количество кавычек) и не имеет отношения к экранированным кавычкам.

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