заменять пробелы только между кавычками - PullRequest
8 голосов
/ 31 марта 2011

У меня есть строка из файла журнала:

field 1234 "text in quotes" 1234 "other text in quotes"

Я хотел бы заменить пробелы между кавычками, чтобы я мог извлечь столбцы, используя пробел в качестве разделителя.Таким образом, результатом может быть что-то вроде

field 1234 "text@in@quotes" 1234 "other@text@in@quotes"

Я не смог сам найти работающее регулярное выражение для sed.Большое спасибо за помощь.Martin

Ответы [ 5 ]

7 голосов
/ 31 марта 2011

Передайте файл журнала с помощью этой команды awk:

awk -F\" '{OFS="\"";for(i=2;i<NF;i+=2)gsub(/ /,"@",$i);print}'
2 голосов
/ 31 марта 2011

Спасибо за все ответы.

Это perl one-liner, который я наконец использую:

perl -pe 's{("[^\"]+")}{($x=$1)=~s/ /@/g;$x}ge'

в результате требуется

field 1234 "text@in@quotes" 1234 "other@text@in@quotes"

.

1 голос
/ 31 марта 2011

при использовании двойной кавычки в качестве RS все четные записи - те, которые находятся внутри двойных кавычек.заменить место в этих четных записях.Поскольку разделитель выходных записей по умолчанию является переводом строки, измените его на двойную кавычку.

awk 'BEGIN {RS="\"";ORS="\"" }{if (NR%2==0){gsub(/ /,"@",$0);print $0}else {p
rint $0}}' InputText.txt
1 голос
/ 31 марта 2011

Рубин (1,9 +)

$ cat file
field 1234 "text in quotes" 1234 "other text in quotes"

$ ruby -ne 'print $_.gsub(/(\".*?\")/){|x| x.gsub!(/\s+/,"@") }'  file
field 1234 "text@in@quotes" 1234 "other@text@in@quotes"
0 голосов
/ 01 апреля 2011

Если вы решите поменять sed на более многофункциональные perl, то вот один вкладыш, чтобы получить то, что вам нужно:

line='field 1234 "text in quotes" 1234 "other text in quotes"'
echo $line | perl -pe 's#("[^"]*")#sub{$p=$1; $p =~ tr/ /@/; return $p}->()#eg'

Output: field 1234 "text@in@quotes" 1234 "other@text@in@quotes"
...