我正在寻找一条在bash中将每行的首字母大写的命令。
实际上,我使用了这个命令:
sed 's/^\(.\)/\U\1/'
但我需要使用另一个命令,而不是“\U”。
我正在寻找一条在bash中将每行的首字母大写的命令。
实际上,我使用了这个命令:
sed 's/^\(.\)/\U\1/'
为什么需要使用除了\U
之外的内容?
您可以使用只大写一个字母的\u
:
sed 's/./\u&/'
while read line ; do echo "${line^}" ; done
[:upper:]
是 POSIX 字符类,用于正则表达式中以一种与语言环境无关的方式匹配大写字母。它与将字母转换为大写字母无关。 - Ed Morton将文件按第一个字符/行的其余部分拆分,将第一个字符大写并将列粘贴在一起。
paste -d "" <(cut -c1 inputfile| tr '[:lower:]' '[:upper:]') <(cut -c2- inputfile)
编辑:
当您想要从流中解析输入(例如mycommand | myscript.sh
)时,我的原始解决方案会导致问题。我的解决方案想要对输入进行两次解析。当您可以等待输入过程完成时,可以将输出重定向到临时文件。
tmpfile=/tmp/myscript.wrk
# read input with cat
cat > ${tmpfile}
paste -d "" <(cut -c1 ${tmpfile}| tr '[:lower:]' '[:upper:]') <(cut -c2- ${tmpfile})
rm -f ${tmpfile} 2>/dev/null
您可以在命令行上尝试相同的操作。没有等待时间,第二个“cut”将找到一个空文件。当原始命令运行超过一秒钟时,1秒的等待时间将失败。
mycommand | tee /tmp/dont_do_this |
cut -c1 | tr '[:lower:]' '[:upper:]' |
paste -d "" - <(sleep 1;cut -c2- /tmp/dont_do_this)
[:lower:]
时,就像问你是否想喝咖啡并补充说你应该从鼻子喝一样:可能但不好。如果你真的想这样做,请尝试下一个解决方案:mycommand | while read -r line; do
printf "%s%s\n" $(tr '[:lower:]' '[:upper:]' <<< "${line:0:1}") "${line:1}"
done
awk
。 - Walter A这是一种简单有效的方法: sed -e 's/^./\U&/' yourfile
\U
? - choroba