我有一个输入字符串,例如:
arg1.arg2.arg3.arg4.arg5
我想要的输出是:
arg5.arg4.arg3.arg2.arg1
它并不总是 5 个参数,可能是 2 到 10 个。
我怎样才能在 bash 脚本中做到这一点?
答案1
tr
使用++tac
的组合paste
$ tr '.' $'\n' <<< 'arg1.arg2.arg3.arg4.arg5' | tac | paste -s -d '.' arg5.arg4.arg3.arg2.arg1
如果你仍然喜欢 bash,你可以这样做,
IFS=. read -ra line <<< "arg1.arg2.arg3.arg4." let x=${#line[@]}-1; while [ "$x" -ge 0 ]; do echo -n "${line[$x]}."; let x--; done
使用
perl
,$ echo 'arg1.arg2.arg3.arg4.arg5' | perl -lne 'print join ".", reverse split/\./;' arg5.arg4.arg3.arg2.arg1
答案2
如果你不介意一点点python
:
".".join(s.split(".")[::-1])
例子:
$ python3 -c 's="arg1.arg2.arg3.arg4.arg5"; print(".".join(s.split(".")[::-1]))'
arg5.arg4.arg3.arg2.arg1
s.split(".")
.
生成一个包含分隔子字符串的列表,[::-1]
反转该列表并将".".join()
反转列表的组件与 结合起来.
。
答案3
您可以通过一次sed
调用来完成此操作:
sed -E 'H;g;:t;s/(.*)(\n)(.*)(\.)(.*)/\1\4\5\2\3/;tt;s/\.(.*)\n/\1./'
这使用保持缓冲区来获取模式空间中的前导换行符,并使用它进行排列,直到换行符后面不再有任何点,此时它从模式空间中删除前导点并用点替换换行符。
使用 BRE 和稍微不同的正则表达式:
sed 'H
g
:t
s/\(.*\)\(\n\)\(.*\)\(\.\)\(.*\)/\1\4\5\2\3/
tt
s/\(\.\)\(.*\)\n/\2\1/'
如果输入包含多行并且您想要反转每一行的顺序:
sed -E 'G;:t;s/(.*)(\.)(.*)(\n)(.*)/\1\4\5\2\3/;tt;s/(.*)\n(\.)(.*)/\3\2\1/'
答案4
SED解决方案:
sed 's/\./\n/g' yourFile | tac | sed ':a; $!{N;ba};s/\n/./g'