在多个字符串的末尾添加一个空格

时间:2020-01-07 12:52:12

标签: linux awk sed

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

首先,我想将所有字符串都大写,但能够将两个sed结合起来,那就太棒了

su -p oracle -c "$ORACLE_HOME/bin/sqlplus -l mydb/mypass@localhost:1521/xe << !
    create sequence SEQ_NAME start with 1000 maxvalue 9999
    /
    create or replace trigger TRG_NAME
    before insert on TABLE_NAME
    for each row
    begin
        select SEQ_NAME.nextval into :new.MY_ID from dual;
    end;
    /
!
"

初始输入:

 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

我想添加一个空格,但无法弄清楚该如何做,如果可能的话,可以通过仅创建一个sed或awk来组合第一个sed和第二个sed。太棒了。

3 个答案:

答案 0 :(得分:2)

使用sed可以很容易地通过几个捕获组和几个反向引用以及\U(用于大写)和\L(用于小写)来实现,例如< / p>

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

在第一个捕获组上方,用'^'固定到行的开头,并捕获所有单词字符\w,然后捕获':',然后到行末。

替换将\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/'

如果'+'重复项需要匹配一个或多个单词字符,而不是与基本正则表达式匹配的'*'(零个或多个),并且您不必逃脱捕获组(...)。缺点并非都支持ERE,但大多数都使用-E-r选项。

注意:,不,我不知道您的示例中的"Hugh"发生了什么-应该删除他吗?)

答案 1 :(得分:1)

Gnu awk:

awk '
    BEGIN{FS=":";OFS=": "} # Changes the separator
    $1=toupper($1) # Converts lower to upper
' <file>

结果:

HUGH: IS MISSING 
LORY: Is Doing well 
TIFANY: Is sick
MELODY: Is back 
HENRY: is Dead 
JACK: is sleeping

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed -E 's/(hugh|lory|melody|tifany|henry|jack):/\U& /Ig' file

或更宽松地说:

sed 's/^\S*:/\U& /' file