Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 用字符串的最后4个字符交换前4个字符的最佳方法?_String_Bash_Swap - Fatal编程技术网

String 用字符串的最后4个字符交换前4个字符的最佳方法?

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/\(....\)

如何将字符串的前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/\(....\)\(.*\)/\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