从命令行,如何在文本文件中改变大写字母的每个第一个字?每行的第一个字的改变大小写
示例输入:
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等)。
从命令行,如何在文本文件中改变大写字母的每个第一个字?每行的第一个字的改变大小写
示例输入:
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等)。
使用awk
单行:
awk -F$'\t' -v OFS=$'\t' '{ $1 = toupper($1) }1' file
使用GNU sed
:
sed 's/^\S*/\U&/g' file
其中\S
相匹配的非空白字符和\U&
转换为大写匹配的模式
UPDATE:在BSD sed
因为我t不与支持大多数的这些特殊字符,它仍然是可行的,但需要一个更长的表达
sed -f script file
在脚本中含有
{
h
s/ .*//
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/\(.*\)\n[^ ]* \(.*\)/\1 \2/
}
我认为这样做,'sed','awk','bash' - 覆盖。 –
对不起,没有注意到它应该在macOS上。为'BSD sed'和'GNU sed'增加了一个通用方法。我同意在'GNU sed'不可用的情况下'awk'脚本会更清晰。 – etopylight
脚本替代工作:) –
你可以随时使用bash大小写转换和while循环完成你的意图,例如
$ while read -r a b; do echo "${a^^} $b"; done < file
HELLO world
HOW are you?
的参数扩展${var^^}
所有字符转换在var
为大写,${var^}
转换的第一个字母。
猛砸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
选项不允许终止一组字符。检查spaces
或tab
定界词的方法是读取整行禁用IFS=
的文字分割,然后通过该行向前扫描,直到找到第一个文字$' '
或$'\t'
。(该文字是bash的,只是,没有POSIX外壳)一个简单的实现是:
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?
哦,对不起,是的,这是有点早期的情况下转换扩展':)' –
@Cœur如果由于任何原因3.2没有* herestring *,你可以做同样的'$(echo“$ a”| tr [az] [AZ])',但最好避免使用管道。 –
如果必须使用'tr','sed'或'awk'会更快。 *参数扩展*闪电般快,但是如果你数千次调用'tr',这可能是* stream编辑器的一个工作*'sed' ......':''记住每个*命令替换*(例如'$(....)'),每次调用'tr'都会产生单独的子壳。 (我会好奇你的'时间sed ...'和'时间awk ...'比较......) –
输出谢谢你,它适用于字后面加一个空格。但实际上,我发现我的数据有表格而不是空格。你会知道如何避免用SPACE替换TAB吗? –
刚刚更新了答案,以便'awk'将空格和制表符作为分隔符。 – codeforester
好的,我终于提出了一个完全适用于TAB的解决方案:'awk -F $'\ t''{OFS =“\ t”} {$ 1 = toupper($ 1)} 1'' –