【问题标题】:converting string to lower case part of a string in bash shell scripting在bash shell脚本中将字符串转换为字符串的小写部分
【发布时间】:2012-12-18 14:46:30
【问题描述】:

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

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

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

非常感谢您。

【问题讨论】:

    标签: shell uppercase


    【解决方案1】:
    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

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

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

    使用 Bash 的 case-modification 参数扩展修饰符(仅限 Bash!):

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

    【讨论】:

    • @glennjackman 不错。我比我更喜欢你的两个解决方案。我不知道其中任何一个功能!
    • declare${,,} 扩展修饰符都不是标准 POSIX sh 功能。在 KornShell 中,可以使用与前者等效的功能,但它是通过内置命令 typeset 完成的。 typeset -l 也适用于 pdksh 和 Bash。所以,请始终使用typeset,永远不要使用declare。 case 修改扩展修饰符是 Bash 唯一的扩展(到目前为止)。
    • 另外,&lt;&lt;&lt; 是 KornShell 和 Bash 扩展,在 POSIX sh 中不可用。
    【解决方案2】:

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

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

    解释

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

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

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

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

    • H: 追加模式空间来容纳空间。
    • x:交换模式空间和保持空间。
    • s/\n/ /:将H 命令的\n 替换为空格。

    我希望你不要对 sed 合成器感到厌恶 ;-)。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 不清楚你为什么这样回答这个问题。你读过它吗?请仔细阅读!
          【解决方案6】:

          一个 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
          

          【讨论】:

            猜你喜欢
            • 2016-01-22
            • 1970-01-01
            • 2011-01-16
            • 2021-09-18
            • 1970-01-01
            • 2023-03-17
            • 2010-09-14
            • 1970-01-01
            • 2021-06-11
            相关资源
            最近更新 更多