首页 > 解决方案 > 如何在 MAC 上使用 sed/awk(不支持 gnu)将单引号添加到仅在单词中间(或除开头之外的任何位置)有点的单词中?

问题描述

包含多行的输入文件的一部分:

.class xyz.com class.name_1 and xxx.co .class class.man_3 'abc.name_4' #id
#id .class abc.name class.name and class.name_2 class.name_3 .class class.dragon class.xyz 

愿望输出:

.class 'xyz.com' 'class.name_1' and 'xxx.co' .class 'class.man_3' 'abc.name_4' #id
#id .class 'abc.name' 'class.name' and 'class.name_2' 'class.name_3' .class 'class.dragon' 'class.xyz' 

也应该处理这个输入:

.xxx-xxxx.xxxx-xxxx 
.xxxx.xxxx
xic.aco-eiopw-ejek.cojdj

输出

.xxx-xxxx.xxxx-xxxx 
.xxxx.xxxx
'xic.aco-eiopw-ejek.cojdj'

我尝试使用sed "s/^\(.* \)\(.*\.\)\(.* \)/\'1\2\3'/g" 它它给出以下输出:

'1class.name_4 #id '
'1class.name_4 '
....

标签: shellawksed

解决方案


你可以试试这个:

sed -E "s/(\S+\.\S*)/'\1'/g" file
.class 'class.name' 'class.name_1' and 'class.name_2' .class 'class.name_3' 'class.name_4' #id

如果您想忽略以#

sed -E "/^[^#]/s/(\S+\.\S*)/'\1'/g" file

编辑解决方法以处理已引用的单词。

sed -E "/^[^#]/s/(\S+\.\S*)/'\1'/g;s/''/'/g" file
.class 'xyz.com' 'class.name_1' and 'xxx.co' .class 'class.man_3' 'abc.name_4' #id

没有 -E 选项。

sed "/^[^#]/s/\(\S+\.\S*\)/'\1'/g;s/''/'/g" file

推荐阅读