次の入力文字列があります。
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
1回の呼び出しでこれを行うことができます。
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'