首页 > 解决方案 > 在多个字符串的末尾添加一个空格

问题描述

我有一个字符串列表,我想通过在末尾添加一个空格来对它们进行修改。

首先我想把所有的字符串都大写,我可以做到,但是如果有办法将两个 sed 结合起来,那就太棒了

 sed  '
s/Hugh:/HUGH:/g ; 
s/Lory:/LORY:/g;
s/Melody:/MELODY:/g;
s/Tifany:/TIFANY:/g;
s/Henry:/HENRY:/g;
s/Jack:/JACK:/g;

'  |  sed '
s/HUGH:/HUGH: /g ; 
s/LORY:/LORY: /g;
s/MELODY:/MELODY: /g;
s/TIFANY:/TIFANY: /g;
s/HENRY:/HENRY: /g;
s/JACK:/JACK: /g;
'  

初始输入:

Hugh:IS MISSING 
Lory:Is Doing well 
Tifany:Is sick
Melody:Is back 
Henry:is Dead 
Jack:is sleeping

目前的结果是

Hugh:IS MISSING 
LORY:Is Doing well 
TIFANY:Is sick
MELODY:Is back 
HENRY:is working 
JACK:is sleeping

我想要的是

Hugh: IS MISSING 
LORY: Is Doing well 
TIFANY: Is sick
MELODY: Is back 
HENRY: is working 
JACK: is sleeping

我想添加一个不知道怎么做的空间,如果可能的话,通过只创建一个 sed 或 awk 来组合第一个 sed 和第二个。会很棒的。

标签: linuxawksed

解决方案


sed您可以使用几个捕获组和几个反向引用以及\U(对于大写字母)和(对于小写字母)很容易地做到这一点\L,例如

sed 's/\(^\w*\):\(.*$\)/\U\1: \L\2/' file

在第一个捕获组上方,锚定到行首,'^'并捕获所有 word-characters \w,然后是 a ':',然后是行尾。

替换用 将所有内容转换为大写\U,在后面添加一个空格':',然后用 将其余部分转换为小写\L

示例使用/输出

$ sed 's/\(^\w*\):\(.*$\)/\U\1: \L\2/' file
HUGH: is missing
LORY: is doing well
TIFANY: is sick
MELODY: is back
HENRY: is dead
JACK: is sleeping

使用扩展正则表达式

使用扩展正则表达式的大致等效但更强大的命令是:

sed -E 's/(^\w+):(.*$)/\U\1: \L\2/'

重复需要'+'1 个或多个单词字符来匹配,而不是与Basic Regular Expressions'*'(零个或多个)匹配,并且您不必转义捕获组。缺点并不是所有都支持 ERE,但大多数都使用or选项。(...)-E-r

注意:不,我不知道"Hugh"你的例子中发生了什么——他应该被删除吗?)


推荐阅读