仅替换引号之间的空格

发布于 2024-10-28 18:46:17 字数 273 浏览 2 评论 0原文

我有来自日志文件的行:

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

我想替换引号之间的空格,这样我就可以使用空格作为分隔符来提取列。所以结果可能是

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

我自己无法找到 sed 的工作正则表达式。 非常感谢您的帮助。 马丁

I have line from log file:

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

I would like to replace spaces in between quotes, so I could than extract columns using space as delimiter. So the result could be something like

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

I was not able to find out working regex for sed myself.
Thanks a lot for help.
Martin

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

辞慾 2024-11-04 18:46:18

红宝石(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"

Ruby(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"
混浊又暗下来 2024-11-04 18:46:18

通过使用双引号作为 RS,所有偶数记录都是双引号内的记录。替换那些偶数记录中的空间。由于输出记录分隔符默认为换行符,请将其更改为双引号。

awk 'BEGIN {RS="\"";ORS="\"" }{if (NR%2==0){gsub(/ /,"@",$0);print $0}else {p
rint $0}}' InputText.txt

by using double quote as RS all even records are the ones inside double quotes. replace space in those even records. Since output records separator is newline by default ,change it to double quote.

awk 'BEGIN {RS="\"";ORS="\"" }{if (NR%2==0){gsub(/ /,"@",$0);print $0}else {p
rint $0}}' InputText.txt
梦里梦着梦中梦 2024-11-04 18:46:18

如果您决定将 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"

If you decide to swap sed with more feature rich perl then here is one liner to get what you need:

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"
无人问我粥可暖 2024-11-04 18:46:17

通过以下 awk 命令传输日志文件:

awk -F\" '{OFS="\"";for(i=2;i<NF;i+=2)gsub(/ /,"@",$i);print}'

Pipe your log file through this awk command:

awk -F\" '{OFS="\"";for(i=2;i<NF;i+=2)gsub(/ /,"@",$i);print}'
冷清清 2024-11-04 18:46:17

感谢您的所有回答。

这是我最终使用的 Perl 单行代码:

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

它会生成 required

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

Thanks for all answers.

This is perl one-liner I finally use:

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

it results in required

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

.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文