首页 > 解决方案 > 如何用引号分隔单词

问题描述

我正在研究汽车数据集;汽车品牌和型号显示在如下字符串中。你可以假设模型只有一个词。

"Honda civic LX" 
"audi 500s (diesel)"
"toyota camry" 
"ford ranger" 

我想要的输出是将 make (包含在一个单词中)用单引号括起来,而 model 和 trim 用它们自己的单引号括起来,如下所示:

'honda' 'civic LX'
'audi' '500s (diesel)'
'toyota' 'camry' 
'ford' 'ranger' 

我还应该注意我使用的数据集是这样组织的。

28.0   4   119   82.0   2720   99   1        "audi 500s (diesel)"
23.5   4   225   76.0   5530   81   1        "toyota camry"

我想用 SED 解决它,我接近通过以下命令解决它。

sed "s/\"/'/g;s/ /' '/" 

但是,这使我的数据集如下所示。你可以看到它在第一列的末尾添加了一个'',这不是我想要的。另外,我认为该命令会分开品牌和型号,但事实并非如此。

28.0' '  4   119   82.0   2720   99   1        'audi 500s (diesel)'
23.5' '  4   225   76.0   5530   81   1        'toyota camry'

标签: awksedcommand-line

解决方案


希望这有效。

sed "s/\"/'/g"| sed -E "s/([a-z])( )/\1' '/"

解释

第一部分(或“查找”部分)([a-z])( )查找出现的小写字母,后跟空格,分成 2 组,用 . 表示()。所以,第一组是字母([a-z]),第二组是空格( )

在第二部分(或替换部分)\1' '中,\1表示找到的第一组(这是反向引用,要使其正常工作,-E 标志是必不可少的)。如果我们不这样做,字母表和空格都将被替换为' ',因此我们将丢失最后一个字母表,这将导致类似aud' '500s (diesel)'. 为了保留最后一个字母,我必须这样做。


推荐阅读