sed - 如何在特定模式之后用一个单词之间替换模式

时间:2017-06-16 05:01:29

标签: bash awk sed

我的文件包含内容低于

的行
name : 'last1, first1', phone : '1111111111', email :'test123@mail.com', name: 'last2,first2', phone : '2222222222', email: 'test234@mail.com',name: 'last3,first3', phone : '3333333333', email:'test456@mail.com

必须像这样替换。

last name : 'last1', first name : 'first1', phone : '1111111111', email :'test123@mail.com', last name: 'last2', first name : 'first2', phone : '2222222222', email: 'test234@mail.com',last name: 'last3, first name: 'first3', phone : '3333333333', email:'test456@mail.com

围绕sed替换有很多问题,但无法找到解决这个问题的任何回复。如果有,请提供链接。

1 个答案:

答案 0 :(得分:0)

使用以下正则表达式将您的字符串回显到sed

sed -e "s_name : '\([a-zA-Z 0-9]*\),\([a-zA-Z 0-9]*\)',\(.*\)_last name : '\1', first name '\2', \3_"

给出了这个结果。

last name : 'last1', first name ' first1',  phone : '1111111111', email :'test123@mail.com', name: 'last2,first2', phone : '2222222222', email: 'test234@mail.com',name: 'last3,first3', phone : '3333333333', email:'test456@mail.com

修改

您的输入存在不一致:name的第一个实例后跟空格和冒号,而其他实例只有冒号,而不是空格。这是一个考虑到这一点的更新版本:

sed -e "s_name *: '\([a-zA-Z 0-9]*\),\([a-zA-Z 0-9]*\)',_last name: '\1', first name: '\2', _g"

给出:

last name: 'last1', first name: ' first1',  phone : '1111111111', email :'test123@mail.com', last name: 'last2', first name" 'first2',  phone : '2222222222', email: 'test234@mail.com',last name: 'last3', first name: 'first3',  phone : '3333333333', email:'test456@mail.com