从命令行,如何将文本文件中每行的第一个单词更改为大写?
示例输入:
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等)的命令行上运行的任何东西。
答案 0 :(得分:2)
您可以随时使用bash case转换和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
字符
要保留制表符分隔的单词,您必须在阅读过程中防止分词。不幸的是,-d
的{{1}}选项不允许终止一组字符。检查read
或spaces
分隔词的方法是读取整行,禁用与tab
进行分词,然后向前扫描直到第一个文字{{1}找到IFS=
或$' '
。 (文字只有bash,而不是POSIX shell)一个简单的实现是:
$'\t'
输出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
答案 1 :(得分:1)
使用awk
one-liner:
awk -F$'\t' -v OFS=$'\t' '{ $1 = toupper($1) }1' file
答案 2 :(得分:1)
使用GNU sed
:
sed 's/^\S*/\U&/g' file
其中\S
匹配非空白字符,\U&
匹配匹配模式
更新:如果是BSD sed
,因为它不支持大多数特殊字符,它仍然可行,但需要更长的表达
sed -f script file
脚本包含
{
h
s/ .*//
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/\(.*\)\n[^ ]* \(.*\)/\1 \2/
}