文字列内の点で区切られた要素の順序を逆に置き換えます。

文字列内の点で区切られた要素の順序を逆に置き換えます。

次の入力文字列があります。

arg1.arg2.arg3.arg4.arg5

私が望む出力は次のとおりです。

arg5.arg4.arg3.arg2.arg1

パラメータは常に5つではなく、2〜10個でもかまいません。

Bashスクリプトでこれをどのように実行できますか?

答え1

  • trtac++の組み合わせを使用してください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

sed1回の呼び出しでこれを行うことができます。

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'

関連情報