文字列内の単語のリストがあります:
str="SaaaaE SeeeeE SbbbbE SffffE SccccE"
取得するために逆にしたい
"SccccE SffffE SbbbbE SeeeeE SaaaaE"
どうすればそれを行うことができますash
か?
awk
次のように使用できます。
echo "$str" | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }'
はい、これらのコマンドを試すことができます。
文字列の場合、
echo "aaaa eeee bbbb ffff cccc"|tr ' ' '\n'|tac|tr '\n' ' '
変数については、
echo $str|tr ' ' '\n'|tac|tr '\n' ' '
純粋なシェルが必要で、外部ツールが必要ない場合は、次のことを考慮してください。
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
これが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
これは機能し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
どちらも使用していないため、最後の例になりました。
Haskell を使用しても問題ない場合は、hawk (haskell-awk) という優れたツールを使用すると、これを非常に簡単に行うことができます。まず、インストールする必要があります:
$ cabal install haskell-awk
それで:
$ echo $str | hawk -m reverse
を見つける必要があり~/.cabal/bin
ます。PATH
hawk
別の純粋な bash ソリューション:
str='test a is this'; res=""; prev=""
while [ "$prev" != "$str" ]; do res="$res${str##* } "; prev="$str"; str="${str% *}"; done
入力をファイルから読み取る場合 (ここで尋ねられたように: 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) 簡単にするために、いくつかのエラー チェックが省略されている可能性があります。
/* 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