代码之家  ›  专栏  ›  技术社区  ›  Dwi Mulia Mokoginta

在bash中,如何在单词的每五个字符后添加连字符

  •  0
  • Dwi Mulia Mokoginta  · 技术社区  · 7 年前

    "ABCDEFGHIJKLMOPQRSTUVWXY"

    一个人如何达到这个结果? "ABCDE-FGHIJ-KLMNO-PQRST-UVWXY"

    7 回复  |  直到 7 年前
        1
  •  8
  •   Tom Fenech    7 年前

    使用sed,您可以首先添加 - 每5个字符后,然后删除尾随字符 - 在行尾:

    $ sed -E 's/.{5}/&-/g; s/-$//' <<<"ABCDEFGHIJKLMNOPQRSTUVWXY"
    ABCDE-FGHIJ-KLMNO-PQRST-UVWXY
    

    在扩展中( -E

    • .{5} 匹配任意5个字符
    • &- 替换为整个匹配(5个字符)加上 -

    - 在队伍的尽头( $ )什么都没有取代。


    FPAT 要定义将行解释为一系列字段的方式,请添加 每个字段之间:

    $ awk -v FPAT='.{5}' -v OFS='-' '{ $1 = $1 } 1' <<<"ABCDEFGHIJKLMNOPQRSTUVWXY"
    ABCDE-FGHIJ-KLMNO-PQRST-UVWXY
    

    定义为任意5个字符和输出字段分隔符 OFS 定义为 - $1 = $1 “接触”每一行,导致它被重新格式化(没有这一部分,什么也不会发生)。 1 是最短的 是的


    在bash中这样做也不太难:

    #!/bin/bash
    
    input="ABCDEFGHIJKLMNOPQRSTUVWXY"
    parts=()
    # build an array from slices of length 5
    for (( i = 0; i < ${#input}; i += 5 )) do
      parts+=( "${input:i:5}" )
    done
    
    # join the array on IFS (use a subshell to avoid modifying IFS for rest of script)
    ( IFS=-; echo "${parts[*]}" )
    
        2
  •  1
  •   RavinderSingh13 Nikita Bakshi    7 年前

    你能试试下面的吗。

    echo "ABCDEFGHIJKLMOPQRSTUVWXY" | sed 's/...../&-/g;s/-$//'
    
        3
  •  0
  •   Inder Manali    7 年前

    sed -E 's/[A-Z]{4}./&-/g' file.txt
    

    ABCDE-FGHIJ-KLMOP-QRSTU-VWXY
    

    如果你想让它们包含更多的大写字母,只需做一个:

    sed -E 's/[A-Za-z]{4}./&-/g' file.txt
    
        4
  •  0
  •   Lewis M    7 年前

    试试这个

    #!/bin/bash
    
    s="ABCDEFGHIJKLMNOPQRSTUVWXY"
    a=($(echo ${s} | grep -o .))
    
    o=""
    i=0
    while [[ ${i} -lt ${#a[@]} ]]; do
        o="${o}${a[${i}]}"
        (( i++ ))
        [[ $(( i % 5 )) -eq 0 ]] && [[ ${i} -ne ${#a[@]} ]] && o="${o}-"
    done
    echo ${o}
    
    exit 0
    
        5
  •  0
  •   karakfa    7 年前

    另一个解决方案 fold/paste

    $ echo {A..Y} | tr -d ' ' |    # this is to generate the string
      fold -w5 | paste -sd-
    
    ABCDE-FGHIJ-KLMNO-PQRST-UVWXY
    
        6
  •  0
  •   potong    7 年前

    这可能适用于您(GNU-sed):

    sed 's/.\{5\}\B/&-/g' file
    

    每五个字符插入一个连字符,只要第五个字符在单词中。

        7
  •  0
  •   glenn jackman    7 年前

    又是一个选择

    perl -pe 's/(.{5})(?=.)/$1-/g' file
    

    匹配后跟另一个字符的5个字符(以避免尾部连字符问题)

    推荐文章