首页 > 解决方案 > 如何将特定列转换为标题大小写

问题描述

我想出了这段代码:

cut -d';' -f4 columns.csv | sed 's/.*/\L&/; s/[a-z]*/\u&/g'

它实际上完成了第四列的工作,但是以我丢失其他列的方式..

我没有成功尝试:

cut -d';' -f4 columns.csv | sed -i 's/.*/\L&/; s/[a-z]*/\u&/g'

那么,如何将更改应用于文件中的特定列并保持其他列不变?

假设 columns.csv 内容是:

TEXT;more text;SoMe MoRe TeXt;THE FOURTH COLUMN;something else

那么,预期的输出应该是:

TEXT;more text;SoMe MoRe TeXt;The Fourth Column;something else

标签: linuxshellawksed

解决方案


GNU sed:

sed -ri 's/;/&\r/3;:1;s/\r([^; ]+\s*)/\L\u\1\r/;t1;s/\r//' columns.csv

更新:

sed -i 's/; */&\n/3;:1;s/\n\([^; ]\+ *\)/\L\u\1\n/;t1;s/\n//' columns.csv

将锚点\r( \n) 放在字段 4 的开头。我们编辑整个单词并将锚点移动到下一个单词的开头。t1 :1只要substitution命令中的模式匹配,就会执行按标签跳转。卸下锚。


推荐阅读