it-swarm.com.de

Wie kann ich eine Liste von Wörtern in einer Shell-Zeichenfolge umkehren?

Ich habe eine Liste von Wörtern in einer Zeichenfolge:

str="SaaaaE SeeeeE SbbbbE SffffE SccccE"

Ich möchte es umkehren, um zu bekommen

"SccccE SffffE SbbbbE SeeeeE SaaaaE"

Wie kann ich das mit ash machen?

12
MOHAMED

Sie können awk wie folgt verwenden:

echo "$str" | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }'
16
Feten besbes

Ja, Sie können diese Befehle ausprobieren, 

Für String ,

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

Für die Variable ,

echo $str|tr ' ' '\n'|tac|tr '\n' ' '
9
Skynet

Sie könnten awk verwenden:

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

Durchlaufen Sie die Felder nach hinten und drucken Sie jedes Feld aus. OFS ist das Ausgabefeld-Trennzeichen (standardmäßig ein Leerzeichen), und ORS ist das Ausgabesatz-Trennzeichen (eine neue Zeile).

Ich gehe davon aus, dass Sie nicht möchten, dass die Reihenfolge der Buchstaben in jedem Wort umgekehrt wird.

6
Tom Fenech

Hier ist eine awk mit dowhile (wird hier bei Stackoverflow nicht oft verwendet)
Keine zusätzliche Variable erforderlich i

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

wenn Sie reine Shell und keine externen Tools benötigen, beachten Sie Folgendes:

reverse_Word_order() {
    local result=
    for Word in [email protected]; do
        result="$Word $result"
    done
    echo "$result" 
}

reverse_Word_order "$str"

Ansonsten kann tac Ihnen sofort helfen:

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

oder

tac -s' ' <<<"$str" | xargs 
2
anandi

sed gruppierung:

str="SaaaaE SeeeeE SbbbbE SffffE SccccE"

echo $str | sed 's/\(.* \)\(.* \)\(.* \)\(.* \)\(.*\)/\5 \4\3\2\1/g'
1
Aguevara

Wenn die Verwendung von Haskell akzeptabel ist, gibt es ein Nice-Tool namens Hawk (haskell-awk), das dies sehr leicht tun kann. Zuerst müssen Sie es installieren:

$ cabal install haskell-awk

Dann:

$ echo $str | hawk -m reverse

Sie benötigen ~/.cabal/bin in Ihrer PATH, um hawk zu finden.

1
Jens Petersen

Dies funktioniert in sh (ich habe ash nicht, kann das also nicht überprüfen):

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

benutze es so:

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

Hier sind ein paar alternativen. Erstens, eine, die nicht den C-Stil for verwendet:

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

Der nächste (von hier ) funktioniert dort, wo Substitutionen nicht funktionieren (z. B. auf Android).

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

Ich habe versucht, eine Lösung zu finden, die in einem Android-Skript funktioniert, wobei sh C-style for oder komplexe Substitutionsoperationen nicht mag. Ich habe das letzte Beispiel erhalten, weil es keines verwendet.

1
starfry

BASH

Dies ist die Funktion, die ich verwende (nicht in Asche getestet)

#reverse_Word_order
function rwo(){ tr ' ' '\n'<<<"[email protected]"|tac|tr '\n' ' ';}
echo $(rwo 'Hello There I am You')
#based on https://stackoverflow.com/a/27703859/1153645

STRICH

(funktioniert auch in bash, aber manche Leute scheinen eine Abneigung gegen Echo zu haben)

rwo(){ echo "$*"|tr ' ' '\n'|tac|tr '\n' ' ';}
0
Alexx Roche

Eine weitere reine Bash-Lösung:

str='test a is this'; res=""; prev=""
while [ "$prev" != "$str" ]; do res="$res${str##* } "; prev="$str"; str="${str% *}"; done
0
Fabien Bouleau
/* 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

AUSGABE


**** Programm zum Umkehren eines Strings ***


Treten Sie hier ein: Ich liebe mein Indien

Sie haben eingegeben: Ich liebe Mein Indien

Gegenteil von String: India My love ich

0
Bhupender Singh

Dies ist eine geringfügige Anpassung des Reverse Characters of Lines Skript im GNU sed-Handbuch:

#!/usr/bin/sed -f

# Skip lines without blanks
/[[:blank:]]/! b

# Embed line between newlines
s/^.*$/\
&\
/

# Reset the t flag
tx

# Label to jump to
:x

# Swap first and last Word between newlines for three or more words
s/\n\([^[:blank:]][^[:blank:]]*\) \(.*\) \([^[:blank:]][^[:blank:]]*\)\n/\3 \
\2\
 \1/

# Jump to label if there was a change on the line
tx

# Swap first and last Word between newlines for exactly two words
s/\n\([^[:blank:]][^[:blank:]]*\) \([^[:blank:]][^[:blank:]]*\)\n/\2\
 \
\1/

# Remove the newline markers
s/\n//g

Es gibt einige Annahmen wie keine führenden oder nachgestellten Leerzeichen und alle Wörter sind durch genau ein Leerzeichen voneinander getrennt. Zeilen mit führenden oder nachgestellten Leerzeichen bleiben unberührt, und Zeilen, bei denen die Wörter nicht durch genau ein Leerzeichen getrennt sind, lassen die zusätzlichen Leerzeichen dort, wo sie sich befinden, was möglicherweise nicht das ist, was gewünscht wird.

Das Skript sollte mit allen POSIX-konformen Sed und Basic Regular Expressions (BRE) funktionieren. Die Verwendung von GNU sed und Extended Regular Expressions (ERE) würde eine bessere Lesbarkeit ermöglichen, wie z

s/\n(\S+) (.*) (\S+)\n/\3 \n\2\n \1/

für die hauptsächliche Substitution, aber wenn Sie sed für dieses Problem verwenden, ist Lesbarkeit wahrscheinlich nicht das oberste Anliegen.

0
Benjamin W.

Wenn die Eingabe aus der Datei gelesen werden soll (wie hier gefragt: Zeilenumkehrung aus einer Datei ) -, Ich habe das folgende Bash-Skript erstellt, das Wörter jeder Zeile in umgekehrter Reihenfolge ausgibt, ohne die Reihenfolge von zu ändern Zeilen der Datei (ich brauchte dies zB beim Lesen der Wörter RTL anstelle von LTR in Chinesisch, usw.):

#!/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}"


Anmerkungen:
1) Stellen Sie sicher, dass sich die Eingabedatei im UNIX-EOL-Format befindet. Andernfalls wird das letzte Word in jeder Zeile abgeschnitten.
2) Einige Fehlerprüfungen wurden der Einfachheit halber möglicherweise ausgelassen

0
harshvchawla