Jen*_*ens 16 shell text-processing
我有一个输入字符串,如:
arg1.arg2.arg3.arg4.arg5
Run Code Online (Sandbox Code Playgroud)
我想要的输出是:
arg5.arg4.arg3.arg2.arg1
Run Code Online (Sandbox Code Playgroud)
它并不总是 5 个参数,可能是 2 到 10 个。
如何在 bash 脚本中执行此操作?
Rah*_*hul 24
使用tr+ tac+ 的组合paste
$ tr '.' $'\n' <<< 'arg1.arg2.arg3.arg4.arg5' | tac | paste -s -d '.'
arg5.arg4.arg3.arg2.arg1
Run Code Online (Sandbox Code Playgroud)如果你仍然喜欢 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
Run Code Online (Sandbox Code Playgroud)使用perl,
$ echo 'arg1.arg2.arg3.arg4.arg5' | perl -lne 'print join ".", reverse split/\./;'
arg5.arg4.arg3.arg2.arg1
Run Code Online (Sandbox Code Playgroud)hee*_*ayl 10
如果你不介意一点点python:
".".join(s.split(".")[::-1])
Run Code Online (Sandbox Code Playgroud)
例子:
$ python3 -c 's="arg1.arg2.arg3.arg4.arg5"; print(".".join(s.split(".")[::-1]))'
arg5.arg4.arg3.arg2.arg1
Run Code Online (Sandbox Code Playgroud)
s.split(".")生成一个包含.分隔子字符串[::-1]的列表,反转该列表并将反转列表".".join()的组件与..您可以通过一次sed调用来完成:
sed -E 'H;g;:t;s/(.*)(\n)(.*)(\.)(.*)/\1\4\5\2\3/;tt;s/\.(.*)\n/\1./'
Run Code Online (Sandbox Code Playgroud)
这使用保持缓冲区获取模式空间中的前导换行符并使用它进行排列,直到换行符后面不再跟着任何点,此时它从模式空间中删除前导点并用点替换换行符。
使用 BRE 和稍微不同的正则表达式:
sed 'H
g
:t
s/\(.*\)\(\n\)\(.*\)\(\.\)\(.*\)/\1\4\5\2\3/
tt
s/\(\.\)\(.*\)\n/\2\1/'
Run Code Online (Sandbox Code Playgroud)
如果输入包含多行,并且您想颠倒每一行的顺序:
sed -E 'G;:t;s/(.*)(\.)(.*)(\n)(.*)/\1\4\5\2\3/;tt;s/(.*)\n(\.)(.*)/\3\2\1/'
Run Code Online (Sandbox Code Playgroud)