23

文字列内の単語のリストがあります:

str="SaaaaE SeeeeE SbbbbE SffffE SccccE"

取得するために逆にしたい

"SccccE SffffE SbbbbE SeeeeE SaaaaE"

どうすればそれを行うことができますashか?

4

17 に答える 17

27

awk次のように使用できます。

echo "$str" | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }'
于 2014-12-30T11:09:38.913 に答える
21

はい、これらのコマンドを試すことができます。

文字列の場合、

echo "aaaa eeee bbbb ffff cccc"|tr ' ' '\n'|tac|tr '\n' ' '

変数については、

echo $str|tr ' ' '\n'|tac|tr '\n' ' '
于 2014-12-30T10:35:46.497 に答える
6

純粋なシェルが必要で、外部ツールが必要ない場合は、次のことを考慮してください。

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

reverse_word_order "$str"

それ以外の場合tacは、すぐに役立ちます:

echo -n "$str" | tac -s' '

また

tac -s' ' <<<"$str" | xargs 
于 2016-04-29T17:28:53.747 に答える
4

これがawk使用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
于 2014-12-30T11:11:36.403 に答える
3

これは機能しshます(持っていないashので確認できません):

reverse() {
    for (( i = ${#*}; i > 0; i-- ))
    {
        echo ${!i}
    }
}

次のように使用します。

$ reversed=$(reverse foo bar baz)
$ echo $reversed
baz bar foo

ここにいくつかの代替手段があります。まず、C スタイルを使用しないものfor:

reverse() {
    while [ ${#*} -gt 0 ]
    do
      echo ${*: -1}
      set -- "${@:1:$(($#-1))}"
    done
}

次のもの(ここから)は、置換が機能しない場所(Androidなど)で機能します

reverse() {
    if [ "$#" -gt 0 ]; then
        local arg=$1
        shift
        reverse "$@"
        printf '%s\n' "$arg"
    fi
}

私は、C スタイルや複雑な置換操作shを好まないAndroid スクリプトで機能するソリューションを見つけようとしていました。forどちらも使用していないため、最後の例になりました。

于 2016-09-04T09:23:02.433 に答える
2

Haskell を使用しても問題ない場合は、hawk (haskell-awk) という優れたツールを使用すると、これを非常に簡単に行うことができます。まず、インストールする必要があります:

$ cabal install haskell-awk

それで:

$ echo $str | hawk -m reverse

を見つける必要があり~/.cabal/binます。PATHhawk

于 2015-04-17T08:16:14.337 に答える
0

別の純粋な bash ソリューション:

str='test a is this'; res=""; prev=""
while [ "$prev" != "$str" ]; do res="$res${str##* } "; prev="$str"; str="${str% *}"; done
于 2016-08-03T13:31:38.163 に答える
0

入力をファイルから読み取る場合 (ここで尋ねられたように: read line reverse from a file )、ファイルの行の順序を変更せずに各行の単語を逆に出力する次の bash スクリプトを作成しました (たとえば、これが必要でした)。中国語などで LTR ではなく RTL という単語を読む場合):

#!/bin/bash

fileName="$1"
outputFile="ReversedFile.npp"

echo > ${outputFile}
lineCount=`cat $fileName | wc -l`
for ((lineNum=1; ${lineNum} <= ${lineCount}; lineNum++))
do
    echo
    echo "Processing Line ${lineNum} of ${lineCount} ..."

    lineOfFile="`cat $fileName | head -${lineNum} | tail -1`"
    echo "${lineOfFile}"

    rm -f wordFile.txt
    for eachWord in `echo "${lineOfFile}"`
    do
        echo "${eachWord}" >> wordFile.txt
    done

    if [ -e wordFile.txt ]; then
        thisLine=""
        wordCount=`cat wordFile.txt| wc -l`
        for ((wordNum=${wordCount}; ${wordNum}>=1; wordNum--))
        do
            wordOfLine="`cat wordFile.txt | head -${wordNum} | tail -1`"
            echo "${wordNum} of ${wordCount} is ${wordOfLine}"
            thisLine+="${wordOfLine} "
        done
        echo "output"
        echo "${thisLine}"
        echo "${thisLine}" >> ${outputFile}
        rm -f wordFile.txt
    fi
done

echo
echo "Output in File ${outputFile}"


注:
1) 入力ファイルが UNIX EOL 形式であることを確認してください。そうしないと、各行の最後の単語が切り捨てられる可能性があります
。2) 簡単にするために、いくつかのエラー チェックが省略されている可能性があります。

于 2016-09-04T12:00:57.687 に答える
0
/* Shell script to reverse the Input String */    
echo " **** Program to Reverse a String **** "
read -p " Enter Here : " text

echo "You have entered : " $text

echo -n "Reverse of String : "

arr=($text)

arrlength=${#arr[@]}

arrlength=`expr $arrlength - 1`

while [ $arrlength -ge 0 ]
do

echo -n ${arr[arrlength]}
echo -n " "
 arrlength=`expr $arrlength - 1`
done

echo

出力


**** 文字列を逆にするプログラム ***


ここに入力してください : I love My India

あなたが入力した : I love My India

文字列の逆 : India My love I

于 2015-04-11T20:54:32.197 に答える