从命令行,如何将文本文件中一行的每个第一个单词更改为大写?
输入示例:
hello world
tell me who you are!
示例输出:
HELLO world
TELL me who you are!
没有空行,它是 ASCII,每行以一个字母单词开头,后跟一个制表符。
使用的工具:任何可以在 macOS 上运行的工具(bash 3.2、BSD sed、awk、tr、perl 5、python 2.7、swift 4 等)。
最佳答案
您始终可以使用 bash 大小写转换和 while 循环来完成您的意图,例如
$ while read -r a b; do echo "${a^^} $b"; done < file
HELLO world
HOW are you?
参数扩展 ${var^^}
将 var
中的所有字符转换为大写,${var^}
转换第一个字母。
Bash 3.2 - 'tr'
对于早期的 bash,您可以使用与 tr
相同的设置以及 herestring 来处理大小写转换:
$ while read -r a b; do echo "$(tr [a-z] [A-Z] <<<"$a") $b"; done file
HELLO world
HOW are you?
保留 \t
字符
要保留制表符分隔的单词,您必须防止在读取过程中进行单词分割。不幸的是,read
的 -d
选项不允许终止一组字符。检查 space
或 tab
分隔单词的一种方法是读取整行,使用 IFS=
禁用分词,然后向前扫描直到找到第一个文字 $' '
或 $'\t'
为止。 (文字仅适用于 bash,而非 POSIX shell)一个简单的实现是:
while IFS= read -r line; do
word=
ct=0
for ((i = 0; i < ${#line}; i++)); do
ct=$i
## check against literal 'space' or 'tab'
[ "${line:$i:1}" = $' ' -o "${line:$i:1}" = $'\t' ] && break
word="${word}${line:$i:1}"
done
word="$(tr [a-z] [A-Z] <<<"$word")"
echo "${word}${line:$((ct))}"
done <file
输出tab
分隔单词
HELLO world
HOW are you?
关于string - 更改每行第一个单词的大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46822330/