如何反转shell字符串中的单词列表?

MOH*_*MED 14 linux shell awk sed ash

我有一个字符串中的单词列表:

str="SaaaaE SeeeeE SbbbbE SffffE SccccE"
Run Code Online (Sandbox Code Playgroud)

我想扭转它以获得

"SccccE SffffE SbbbbE SeeeeE SaaaaE"
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做ash

Lar*_*ara 18

您可以使用awk如下:

echo "$str" | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }'
Run Code Online (Sandbox Code Playgroud)


Sky*_*net 13

是的,您可以尝试这些命令,

对于字符串,

echo "aaaa eeee bbbb ffff cccc"|tr ' ' '\n'|tac|tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

对于变量,

echo $str|tr ' ' '\n'|tac|tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

  • 我的 ash 不支持 tac (2认同)

Tra*_*ner 9

对于那些想要一个简单且不复杂的单行解决方案的人来说,tac是最佳选择。tac这是我知道的使用和命令替换的最简单方法:

echo $(tac -s ' ' <<< $str)
Run Code Online (Sandbox Code Playgroud)


Tom*_*ech 6

你可以使用awk:

echo "aaaa eeee bbbb ffff cccc" | awk '{for(i=NF;i>0;--i)printf "%s%s",$i,(i>1?OFS:ORS)}'
Run Code Online (Sandbox Code Playgroud)

向后循环穿过字段,打印每个字段.OFS是输出字段分隔符(默认为空格),ORS是输出记录分隔符(换行符).

我假设你不希望每个单词中的字母顺序颠倒过来.


ana*_*ndi 6

如果您需要纯外壳,没有外部工具,请考虑:

reverse_word_order() {
    local result=
    for word in $@; do
        result="$word $result"
    done
    echo "$result" 
}

reverse_word_order "$str"
Run Code Online (Sandbox Code Playgroud)

否则tac可以立即帮助您:

echo -n "$str" | tac -s' '
Run Code Online (Sandbox Code Playgroud)

或者

tac -s' ' <<<"$str" | xargs 
Run Code Online (Sandbox Code Playgroud)


Jot*_*tne 5

这是一个awkusing do while(在 Stackoverflow 上没有太多使用)
不需要额外的变量i

echo "aaaa eeee bbbb ffff cccc"|awk '{do printf "%s"(NF>1?FS:RS),$NF;while(--NF)}'
cccc ffff bbbb eeee aaaa
Run Code Online (Sandbox Code Playgroud)

  • `--NF` 的效果是每个 POSIX 未定义的行为,因此在不同的 awk 版本中其行为会有所不同。 (2认同)