我在日志文件中有一行:
field 1234 "text in quotes" 1234 "other text in quotes"
我想替换引号之间的空格,所以我可以使用空格作为分隔符来提取列。所以结果可能是
field 1234 "text@in@quotes" 1234 "other@text@in@quotes"
我自己无法找到工作正则表达式。 非常感谢您的帮助。 马丁
答案 0 :(得分:7)
通过此awk命令管道您的日志文件:
awk -F\" '{OFS="\"";for(i=2;i<NF;i+=2)gsub(/ /,"@",$i);print}'
答案 1 :(得分:2)
感谢所有答案。
这是我最终使用的perl one-liner:
perl -pe 's{("[^\"]+")}{($x=$1)=~s/ /@/g;$x}ge'
导致必需的
field 1234 "text@in@quotes" 1234 "other@text@in@quotes"
答案 2 :(得分:1)
红宝石(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"
答案 3 :(得分:1)
使用双引号作为RS所有偶数记录都是双引号内的记录。替换那些偶数记录中的空格。由于输出记录分隔符默认为换行符,因此将其更改为双引号。
awk 'BEGIN {RS="\"";ORS="\"" }{if (NR%2==0){gsub(/ /,"@",$0);print $0}else {p
rint $0}}' InputText.txt
答案 4 :(得分:0)
如果您决定将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"