我有一个字符串列表,我想通过在字符串末尾添加一个空格来对其进行修改。
首先,我想将所有字符串都大写,但能够将两个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。太棒了。
答案 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