用前4个字符串交换前4个字符的方法是什么?
e.g。我有字符串20140613,我想将其转换为06132014。
答案 0 :(得分:8)
$ f=20140613
$ g=${f#????}${f%????}
$ echo $g
06132014
为了处理更长的字符串,需要以下内容。 (灵感来自konsolebox的答案。)
echo ${f:(-4)}${f:4:${#f} - 8}${f:0:4}
答案 1 :(得分:4)
答案 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