80

文字列「12345」で、文字列「54321」を出力します。できればサードパーティのツールや正規表現を使用しないでください。

4

13 に答える 13

185

「サードパーティのツールなし」とおっしゃっていたと思いますが、ツールが明らかに適切すぎる場合があります。さらに、ほとんどのLinuxシステムにデフォルトでインストールされています。

[madhatta@risby tmp]$ echo 12345 | rev
54321

詳細については、revのマニュアルページを参照してください。

于 2011-01-23T08:35:13.220 に答える
32

単純:

var="12345"
copy=${var}

len=${#copy}
for((i=$len-1;i>=0;i--)); do rev="$rev${copy:$i:1}"; done

echo "var: $var, rev: $rev"

出力:

$ bash rev
var: 12345, rev: 54321
于 2011-01-23T06:41:15.103 に答える
15

変数「var」の値が「123」であると想定します。

var="123"

文字列を逆にして、新しい変数'rav'に格納します。

rav=$(echo $var | rev)

echoを使用すると、「rav」の値が「321」であることがわかります。

echo $rav
于 2014-02-12T22:00:22.843 に答える
12

rev | tail -r(BSD)またはrev | tac(GNU)も行を逆にします:

$ rev <<< $'12\n34' | tail -r
43
21
$ rev <<< $'12\n34' | gtac
43
21

LC_CTYPEがCの場合、revはマルチバイト文字のバイトを逆にします。

$ LC_CTYPE=C rev <<< あの
��め�
$ export LC_ALL=C; LC_ALL=en_US.UTF-8 rev <<< あの
のあ
于 2013-04-11T08:56:20.643 に答える
9

@osdyngの回答を改善するbashソリューション(私の編集は受け入れられませんでした):

var="12345"     rev=""

for(( i=0 ; i<${#var} ; i++ )); do rev="${var:i:1}$rev"; done

echo "var: $var, rev: $rev"

または、さらに単純な(bash)ループ:

var=$1   len="${#var}"   i=0   rev=""

while (( i<len )); do rev="${var:i++:1}$rev"; done

echo "var: $var, rev: $rev"

POSIXソリューション:

var="12345"     rev=""    i=1

while  [ "$i" -le "${#var}" ]
do     rev="$(echo "$var" | awk -v i="$i" '{print(substr($0,i,1))}')$rev"
       : $(( i+=1 ))
done

echo "var: $var, rev: $rev"

注:これはマルチバイト文字列で機能します。カットソリューションは、ASCII(1バイト)文字列でのみ機能します。

于 2016-01-08T01:50:36.713 に答える
6

これにより、文字列が「インプレース」で反転します。

a=12345
len=${#a}
for ((i=1;i<len;i++)); do a=$a${a: -i*2:1}; done; a=${a:len-1}
echo $a

または、3行目は次のようになります。

for ((i=0;i<len;i++)); do a=${a:i*2:1}$a; done; a=${a:0:len}

また

for ((i=1;i<len;i++)); do a=${a:0:len-i-1}${a: -i:i+1}${a:len-i-1:1}; done
于 2011-01-23T07:13:11.310 に答える
6

rev(推奨)がない場合は、null文字列のフィールドを分割し(すべての文字が個別のフィールドです)、逆に出力する次の単純なawkソリューションがあります

awk -F '' '{ for(i=NF; i; i--) printf("%c", $i); print "" }'

上記のawkコードはPOSIXに準拠しています。準拠したawk実装は、すべてのPOSIX準拠のOSで実行されることが保証されているため、ソリューションを「サードパーティ」と見なすべきではありません。このコードは、純粋なPOSIX sh(またはbash)ソリューションよりも簡潔で理解しやすいものになるでしょう。

(;null文字列を-Fの正規表現と見なすかどうかはわかりません...;)

于 2016-01-08T05:18:20.557 に答える
6

文字列を逆にするいくつかの簡単な方法

echo '!!!esreveR si sihT' | grep -o . | tac | tr -d '\n' ; echo

echo '!!!esreveR si sihT' | fold -w 1 | tac | tr -d '\n' ; echo

16進値に変換してから、逆にします

echo '!!!esreveR si sihT' | xxd -p | grep -o .. | tac | xxd -r -p ; echo

echo '!!!esreveR si sihT' | xxd -p | fold -w 2 | tac | xxd -r -p ; echo
于 2017-10-05T20:26:29.910 に答える
4

場合var=12345

for((i=0;i<${#var};i++)); do rev="$rev${var:~i:1}"; done

c=$var; while [ "$c" ]; do rev=$rev${c#"${c%?}"}; c=${c%?}; done

echo "var: $var, rev: $rev"

それを実行します:

$ rev
var: 12345, rev: 54321
于 2016-12-11T02:09:34.537 に答える
3

もちろんこれは短縮できますが、理解しやすいはずです。最後printに改行が追加されます。

echo 12345 | awk '{for (i = length($0); i > 0; i--) {printf("%s", substr($0, i, 1));} print "";}'
于 2015-04-10T15:20:39.860 に答える
3

誰も解決策を投稿していないsedようですので、これは非GNU sedで機能するものです(したがって、「サードパーティ」とは見なしません)。正規表現を使用して単一の文字をキャプチャします.が、それが唯一の正規表現です。

2つの段階で:

$ echo 123456 | sed $'s/./&\\\n/g' | sed -ne $'x;H;${x;s/\\n//g;p;}'
654321

これは、bash形式の置換を使用して、スクリプトに改行を含めます(質問にはのタグが付けられているため)。これは、最初に入力文字列を文字ごとに1行に分割し、次に各文字をホールドバッファの先頭に挿入することによって機能します。

  • xホールドスペースとパターンスペースを入れ替えて、
  • HHは、(現在の)パターンスペースをホールドスペースに追加します。

したがって、すべての文字について、その文字をホールドスペースに配置し、古いホールドスペースを追加して、入力を逆にします。最後のコマンドは、元の文字列を再構築するために改行を削除します。

これは任意の単一の文字列で機能するはずですが、複数行の入力を単一の出力文字列に連結します。

于 2018-01-14T03:21:55.360 に答える
1

別の簡単なawk解決策は次のとおりです。

awk 'BEGIN{FS=""} {for (i=NF; i>0; i--) s=s $i; print s}' <<< '123456'

654321
于 2020-02-27T21:04:29.963 に答える
-1

単語を読む

reve=`echo "$word" | awk '{for(i=length($0); i>0;i--) printf (substr($0,i,1));}'`
echo  "$reve"
于 2019-10-21T15:48:34.463 に答える