用前4个字符串交换前4个字符的最佳方法是什么?

时间:2014-07-14 14:26:44

标签: string bash swap

用前4个字符串交换前4个字符的方法是什么?

e.g。我有字符串20140613,我想将其转换为06132014。

9 个答案:

答案 0 :(得分:8)

$ f=20140613
$ g=${f#????}${f%????}
$ echo $g
06132014

为了处理更长的字符串,需要以下内容。 (灵感来自konsolebox的答案。)

echo ${f:(-4)}${f:4:${#f} - 8}${f:0:4}

答案 1 :(得分:4)

只需使用子字符串扩展:

$ STRING=20140613
$ echo "${STRING:(-4)}${STRING:0:4}"
06132014

请参阅Parameter Expansion

答案 2 :(得分:3)

使用纯BASH正则表达式:

s='20140613'

[[ "$s" =~ ^(.*)([[:digit:]]{4})$ ]] && echo "${BASH_REMATCH[2]}${BASH_REMATCH[1]}"
06132014

答案 3 :(得分:2)

使用针对此类转换优化的date

$ str="20140613"
$ date +"%m%d%Y" -d "$str"
06132014

当您必须转换日期时,无需查看到目前为止;)

答案 4 :(得分:1)

使用sed:

STRING="20140613"
STRING=$(echo $STRING | sed 's/\(....\)\(.*\)/\2\1/')

答案 5 :(得分:1)

通过sed,

$ echo 20140613 | sed 's/^\(.\{4\}\)\(.\{4\}\)$/\2\1/g'
06132014

通过perl

$ echo 20140613 | perl -pe 's/^(.{4})(.{4})$/\2\1/g'
06132014

答案 6 :(得分:1)

或使用awk

echo 20140613 | awk '{print substr($0,5,7) substr($0,1,4)}'

测试:

~$ echo 20140613 | awk '{print substr($0,5,7) substr($0,1,4)}'
>> 06132014

答案 7 :(得分:1)

使用GNU Coreutils:

input=20140613
output=$(echo $input | fold -w4 | tac | tr -d \\n)

如果您还需要最后一次换行,则可以将tr -d \\n替换为printf %s%s\\n,或者只需将&& echo附加到该命令。

答案 8 :(得分:0)

使用perl

for str in 11112222 1111xxxx2222 111222
do
    echo -n "$str -> "
    echo "$str" | perl -ple 's/^(.{4})(.*)(.{4})$/\3\2\1/'
done

产生

11112222 -> 22221111
1111xxxx2222 -> 2222xxxx1111
111222 -> 111222