任务是反转单词中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.