2017-10-19 69 views
2

从命令行,如何在文本文件中改变大写字母的每个第一个字?每行的第一个字的改变大小写

示例输入:

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等)。

回答

1

使用awk单行:

awk -F$'\t' -v OFS=$'\t' '{ $1 = toupper($1) }1' file 
+1

输出谢谢你,它适用于字后面加一个空格。但实际上,我发现我的数据有表格而不是空格。你会知道如何避免用SPACE替换TAB吗? –

+0

刚刚更新了答案,以便'awk'将空格和制表符作为分隔符。 – codeforester

+1

好的,我终于提出了一个完全适用于TAB的解决方案:'awk -F $'\ t''{OFS =“\ t”} {$ 1 = toupper($ 1)} 1'' –

1

使用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/ 
} 
+0

我认为这样做,'sed','awk','bash' - 覆盖。 –

+0

对不起,没有注意到它应该在macOS上。为'BSD sed'和'GNU sed'增加了一个通用方法。我同意在'GNU sed'不可用的情况下'awk'脚本会更清晰。 – etopylight

+0

脚本替代工作:) –

1

你可以随时使用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选项不允许终止一组字符。检查spacestab定界词的方法是读取整行禁用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? 
+0

哦,对不起,是的,这是有点早期的情况下转换扩展':)' –

+0

@Cœur如果由于任何原因3.2没有* herestring *,你可以做同样的'$(echo“$ a”| tr [az] [AZ])',但最好避免使用管道。 –

+0

如果必须使用'tr','sed'或'awk'会更快。 *参数扩展*闪电般快,但是如果你数千次调用'tr',这可能是* stream编辑器的一个工作*'sed' ......':''记住每个*命令替换*(例如'$(....)'),每次调用'tr'都会产生单独的子壳。 (我会好奇你的'时间sed ...'和'时间awk ...'比较......) –

相关问题