任务是反转单词中5个或更少字符的所有字母(a-za-z)。
编辑:假设单词是英语字母表中一个不间断的字母序列。
(字母:ASCII范围a-z&&a-z)
例子:
输入:"One ring to rule them all, one ring to find them, One ring to bring them all and in the darkness bind them."
输出:"enO gnir ot elur meht lla, eno gnir ot dnif meht, enO gnir ot gnirb meht lla dna ni eht darkness dnib meht."
我已经可以写这个脚本了,但是它使用了一些特殊的字符,比如{,.},这些字符不应该被反转。

#!/bin/bash

    word_length=0
    touch tmp

    for word in $(cat ./TEXT)
    do
            word_length=$(echo -n $word | wc -c )
            if [ $word_length -le 5 ]
            then
                    echo -n $word | rev >> tmp
                    echo -n " " >> tmp
            else
                    echo -n $word >> tmp
                    echo -n " " >> tmp
            fi
    done

    cat tmp > TEXT
    echo " " >> TEXT
    rm -rf tmp

此脚本的输出:
"enO gnir ot elur meht ,lla eno gnir ot dnif ,meht enO gnir ot gnirb meht lla dna ni eht darkness dnib .meht"
你可以看到{,.}在错误的地方。

最佳答案

您可以使用此awk代码:

awk 'function revw(wrd) {
   if (wrd ~ /[^a-zA-Z]+[a-zA-Z]+$/ || length(wrd) > 5)
      return wrd
   nw = wrd
   sub(/^[a-zA-Z]+/, "", nw)
   sub(/[^a-zA-Z]+$/, "", wrd)
   rw = ""
   for (j=length(wrd); j>0; j--)
      rw = rw substr(wrd, j, 1)
   return rw nw
}
{
   line = ""
   for (i=1; i<=NF; i++)
      line = line revw($i) (i==NF ? "" : OFS)
   print line
}' file

enO gnir ot elur meht lla, eno gnir ot dnif meht, enO gnir ot gnirb meht lla dna ni eht darkness dnib meht.

09-04 01:58