【问题标题】:How to change a specific character from upper case to lower case using awk or sed or python?如何使用 awk 或 sed 或 python 将特定字符从大写更改为小写?
【发布时间】:2022-01-27 11:52:04
【问题描述】:

我有一行字符串(BCCDDDCDCCDDDDDDABCDABCABDBACBDCAACCBBCABACBCCABCACBCDCCCBDBACDCBBCBCBCCCACADAACCABABADBCBAABBBCCBB)

我想将特定字符(例如第 4 个字符)替换为小写。

我已经尝试过这个 awk 命令;

awk '{for (i=1; i<=NF; ++i) { $i=toupper(substr($i,1,1)) tolower(substr($i,2)); } print }' input > output

输入文件包含字符串

"BCCDDDCDCCDDDDDDABCDABCABDBACBDCAACCBBCABACBCCABCACBCDCCCBDBACDCBBCBCBCCCACADAACCABABADBCBAABBBCCBB"

这个 awk 命令给出这个输出:

"Bccdddcdccddddddabcdabcabdbacbdcaaccbbcabacbccabcacbcdcccbdbacdcbbcbcbcccacadaaccababadbcbaabbbccbb"

如何将除第 4 个字符之外的所有其他字符更改为小写?

【问题讨论】:

  • 请用您的预期输出更新问题(对于给定的输入);输入会有多行,如果是这样......你需要修改每行中的第 4 个字符吗?一行是否可以有多个字段(您的示例只有 1 个字段),如果是这样,您是否需要隐藏第一个字段的第 4 个字符或每个字段的第 4 个字符
  • 您的问题包含相互矛盾的陈述!首先您说“我喜欢将特定字符(例如,第 4 个字符)替换为小写。”然后您最终说“现在,我该如何更改所有其他字符除了第 4 个字符以外的小写?”。那么它是哪一个?请编辑您的问题,以便清楚简洁地说明您想要什么,并根据显示的 input 添加所需 output 的示例。

标签: linux awk sed


【解决方案1】:

GNUsed,请你试试:

sed -E 's/(.{3})(.)/\1\L\2/' YourFile

python,假设变量s被赋值给该行,

print(s[0:3] + s[3:4].lower() + s[4:])

【讨论】:

    【解决方案2】:

    将每行的第 4 个字母改为小写:

    gawk '{$0 = substr($0,1,3) tolower(substr($0,4,1)) substr($0,5)} 1' YourFile
    

    或者:

    gawk -F '' '{$4=tolower($4)} 1' OFS='' YourFile
    

    或者使用 Perl:

    perl -pne 'substr($_,4,1) = lc(substr($_,4,1))' YourFile
    

    【讨论】:

      【解决方案3】:

      一个函数的python例子,我让你理解逻辑并适应你的问题。

      def f(s):
          # your result
          res = ""
      
          # iterate though each character in the string
          for i in range(0, len(s)):
      
              # on some condition, here 4th character, you add a lowercase character to your result
              if(i == 3): 
                  res += s[i].lower()
      
              # on some other conditions an upper case character...
              elif condition_2_to_create: 
                  res += s[i].upper()
      
              # or just the character as it is in the string without modification
              else:
                  res += s[i]
      
          # Then return your result
          return res
      

      【讨论】:

        【解决方案4】:

        在那条线上你可以使用这样的东西。通过-F '',每个字母现在都是一个可以通过$i 访问的字段。

        $ cat line
        BCCDDDCDCCDDDDDDABCDABCABDBACBDCAACCBBCABACBCCABCACBCDCCCBDBACDCBBCBCBCCCACADAACCABABADBCBAABBBCCBB
        
        $ awk -F '' '{ for(i=1;i<=NF;++i){
            if(i!=4){
              printf("%s",tolower($i))}
            else{
              printf("%s",$i)} } print "" }' line
        bccDddcdccddddddabcdabcabdbacbdcaaccbbcabacbccabcacbcdcccbdbacdcbbcbcbcccacadaaccababadbcbaabbbccbb
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-08
          • 2011-08-13
          • 2015-06-13
          • 2019-07-20
          • 2019-09-16
          • 2010-09-25
          • 2022-01-03
          相关资源
          最近更新 更多