反转字符串中点分隔元素的顺序

反转字符串中点分隔元素的顺序

我有一个输入字符串,例如:

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'

相关内容