linux - 在多个字符串的末尾添加一个空格
问题描述
我有一个字符串列表,我想通过在末尾添加一个空格来对它们进行修改。
首先我想把所有的字符串都大写,我可以做到,但是如果有办法将两个 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 和第二个。会很棒的。
解决方案
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"
你的例子中发生了什么——他应该被删除吗?)
推荐阅读
- javascript - 动态呈现的可触摸不随状态值变化而更新
- powerbi - 如何在 Power BI 中始终如一地设置本地日期,以便它在桌面和 PBI 服务中工作
- java - 如何将 mouseMove 事件发送到 Java 应用程序?
- xcode - Xcode 11.x 中的标头搜索路径?
- pandas - 当 groupby 和 agg 在同一列时,列顺序发生变化
- html - 你如何只显示背景的一部分是css?
- r - 为什么在 Rcpp 中使用并行 omp 会导致分段错误?
- android - 无论我做什么,Unity Android 构建在 Gradle 阶段都会失败
- c++ - 检测二值图像中的简单线条(线条矢量)
- python - Google Places API - 按联系人字段过滤