String 用字符串的最后4个字符交换前4个字符的最佳方法?
如何将字符串的前4个字符与后4个字符交换 e、 g.我有字符串20140613,我想将其转换为06132014。使用纯BASH正则表达式:String 用字符串的最后4个字符交换前4个字符的最佳方法?,string,bash,swap,String,Bash,Swap,如何将字符串的前4个字符与后4个字符交换 e、 g.我有字符串20140613,我想将其转换为06132014。使用纯BASH正则表达式: s='20140613' [[ "$s" =~ ^(.*)([[:digit:]]{4})$ ]] && echo "${BASH_REMATCH[2]}${BASH_REMATCH[1]}" 06132014 使用sed: STRING="20140613" STRING=$(echo $STRING | sed 's/\(....\)
s='20140613'
[[ "$s" =~ ^(.*)([[:digit:]]{4})$ ]] && echo "${BASH_REMATCH[2]}${BASH_REMATCH[1]}"
06132014
使用sed:
STRING="20140613"
STRING=$(echo $STRING | sed 's/\(....\)\(.*\)/\2\1/')
通过sed
$ echo 20140613 | sed 's/^\(.\{4\}\)\(.\{4\}\)$/\2\1/g'
06132014
通过perl
$ echo 20140613 | perl -pe 's/^(.{4})(.{4})$/\2\1/g'
06132014
为了处理较长的字符串,需要如下内容。(灵感来自konsolebox的回答。)
或使用
awk
:
echo 20140613 | awk '{print substr($0,5,7) substr($0,1,4)}'
测试:
只需使用子字符串展开:
$ STRING=20140613
$ echo "${STRING:(-4)}${STRING:0:4}"
06132014
请参阅使用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
使用GNU Coreutils:
input=20140613
output=$(echo $input | fold -w4 | tac | tr -d \\n)
如果还需要最后一行馈送,可以将
tr-d\\n
替换为printf%s%s\\n
,或者只需将和&echo
附加到命令中。使用日期
,该日期针对此类转换进行了优化:
$ str="20140613"
$ date +"%m%d%Y" -d "$str"
06132014
当您必须转换日期时,无需查看所有日期;) 我喜欢这个,干净而简单:)我也喜欢????指定前4个和%????指定最后4个?@etan reisner:我对你的答案投了赞成票,因为它(1)将在任何POSIX外壳中运行,(2)它完全依赖内置程序,不会产生新进程。@user3388884:是的,它被称为“参数扩展”,这里有一个权威的参考:@user3388884
?
是任何单个字符的shell glob。根据mkalkov(和bash手册页)的链接,#
和%
在变量值的开始和结束处匹配。不幸的是,如果输入超过8个字符,这将不起作用,如:f=2014abcd0613
+1,但是它太冗长了:)我不知道为什么bash
至少不能为bash\u-REMATCH
选择一个较短的名字。同意bash\u-REMATCH
真是个愚蠢的名字。。简单的GROUP
或MATCH
就足够了。您可以进一步将sed命令改进为sed-r“s/^(.{4})(.{4})/\2\1/“
。简单地说:这就是解决方案。;)伟大的的确对于日期特定的转换,date通常是正确的工具。这种任务可以使用sed
完成。使用像perl这样的完整技术在shell脚本中偶尔做一些小事情不是很实用。@IdrissNeumann OMG为什么?特别是对于偶尔的小任务,不管你用什么,重要的是完成任务。我多次使用sed
,但这里已经有一些sed
asnwers,所以添加了一个perl
一个。奇怪的是,在你(漂亮的)回答中,你使用的是date
,而不是sed
:)也许你应该定义什么是“小而偶然”以及什么是“大而普通”的任务:)您能告诉我,为什么使用perl时,小任务和偶尔的任务是“不实用的”@jm666我更喜欢使用date
,它是为这种特殊情况进行日期转换的正确shell工具。但是,总的来说,我认为在shell脚本中引入Perl(或者Python,或者PHP cli)这样的技术来进行这样的小操作是不现实的。在我看来,最好使用sed
、awk
、grep
、bash内置、其他命令,如date
。。。在bash脚本中。@IdrissNeumann人们普遍错误地认为,perl
仅适用于web开发和/或某些非常难以使用其他工具类型的任务。事实并非如此。Perl非常适合于bash scipts和/或作为一行程序使用然而,你只是重复了你已经说过的话,没有任何解释——好吧——我接受你的观点
11112222 -> 22221111
1111xxxx2222 -> 2222xxxx1111
111222 -> 111222
input=20140613
output=$(echo $input | fold -w4 | tac | tr -d \\n)
$ str="20140613"
$ date +"%m%d%Y" -d "$str"
06132014