在bash shell脚本中将字符串转换为字符串的小写部分

时间:2012-12-18 14:46:31

标签: shell uppercase

我有一个file.txt,文件的每一行都是:

ABLED   EY B AH L D
ABLER   EY B AH L ER

我想拥有每一行的第二部分:EY B AH L DEY B AH L ER,例如,小写,保持其余的大写。我该怎么办?

非常感谢你。

6 个答案:

答案 0 :(得分:7)

while read first second; do
    second=$(echo "$second" | tr [:upper:] [:lower:])
    printf '%s\t%s\n' "$first" "$second"
done < file.txt

输出:

ABLED   ey b ah l d
ABLER   ey b ah l er

另外两种方法在KornShell,pdksh或Bash中执行此操作而不调用tr

在变量上设置“lowercase”标志(仅限KornShell和兼容shell):

typeset -l second
while read first second; do
    printf '%s\t%s\n' "$first" "$second"
done < file.txt

使用Bash的大小写修改参数扩展修饰符(仅限Bash!):

while read first second; do
    printf '%s\t%s\n' "$first" "${second,,}"
done < file.txt

答案 1 :(得分:1)

可以使用以下令人难以置信的混淆脚本使用sed来完成:

sed -e 'h;s/ .*//;x;s/[^ ]* //;y/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/;H;x;s/\n/ /' your_file

<强>解释

脚本的第一部分(h;s/ .*//;x;s/[^ ]* //)将部分放在保留空间中第一个空格之前的行和模式空间中第一个空格之后的行部分:

  • h:复制保留空间中的实际行。
  • s/ .*//:仅在第一个空格之前的图案空间中保留字符。
  • x:切换保留和模式空间。
  • s/[^ ]* //:仅在第一个空格之后的图案空间中保留字符。

好的,现在我们在保留空间中有第一部分线,在模式空间中有第二部分。我们需要将第二部分放在小写字母中,所以我们使用y/AZERTYUIOPQSDFGHJKLMWXCVBN/azertyuiopqsdfghjklmwxcvbn/(是的,我有一个AZERTY键盘)。

然后,只需要将文件的第一部分和第二部分一起取回:

  • H:追加模式空间以容纳空间。
  • x:交换模式空间并保留空间。
  • s/\n/ /:用空格替换\n命令的H

我希望你不要被sed synthax反感; - )。

答案 2 :(得分:0)

Python脚本:

import sys
for l in sys.stdin.read().splitlines():
    try:
        head,rest = l.split(' ', 1)
        print head, rest.lower()
    except: print l

像这样运行(假设您将脚本保存在名为filter.py的文件中):

$ python filter.py < file.txt

答案 3 :(得分:0)

如果你知道你的文件在阅读时不会改变,并且使用bash:

paste -d " " <(cut -d " " -f 1 your_file) <(cut -d " " -f 2- your_file | tr "[:upper:]" "[:lower:]")

答案 4 :(得分:0)

如果你想要一个解决方案使用管道(不是粘贴解决方案)并且比sed解决方案更容易理解,这是一个awk的解决方案:

awk -F "[ ]" '{str=$1;$1="";print str tolower($0)}' your_file

字段分隔符不能简单地为" ",因为在这种情况下,连续空格被视为单个分隔符。

答案 5 :(得分:0)

即使您希望在Linux平台上运行它,也请在脚本开头使用#!/ bin / ksh。这个ksh接受我们在Hp Ux和Solaris中使用的所有类型的排版变量。