2010-04-05 9 views
6

Ho un compito a casa dove devo prendere input da un file e rimuovere continuamente la prima parola in una riga e aggiungerla alla fine della riga fino a quando tutte le combinazioni sono state fatte.Come eseguire uno spostamento circolare di stringhe in bash?

Non so davvero da dove cominciare e sarei grato per qualsiasi tipo di direzione.

La parte che mi ha confuso è che questo deve essere eseguito senza l'uso di matrici. Non sto solo cercando qualcuno che risolva il problema per me, sto solo cercando una direzione.

campione di ingresso:

Pipes and Filters 
Java Swing 
Software Requirements Analysis 

CAMPIONE DI USCITA:

Analysis Software Requirements 
Filters Pipes and 
Java Swing 
Pipes and Filters 
Requirements Analysis Software 
Software Requirements Analysis 
Swing Java 
+0

Simili: [Come faccio a dividere una stringa su un delimitatore in Bash?] (http://stackoverflow.com/q/918886/55075) a SO – kenorb

risposta

6

alcuni bocconcini che dovrebbero aiutare: quando si chiama una funzione con una stringa, la stringa viene diviso in più argomenti (la positional parameters, chiamato $n, dove n sono numeri interi a partire da 1) sui caratteri nella variabile $IFS (che per impostazione predefinita spazi, tabulazioni e ritorni a capo)

function first() { 
    echo $1 
} 
first one two three 
# outputs: "one" 

$* and [email protected] vi diamo tutti i parametri posizionali, in ordine.

secondo luogo, la variabile speciale $# contiene il numero di argomenti a una funzione.

In terzo luogo, shift scarta il primo parametro posizionale e si muove su tutti gli altri per uno.

function tail() { 
    shift 
    echo $* 
} 

In quarto luogo, è possibile catturare l'output di comandi e funzioni utilizzando `...` or $(...)

rest=`tail $*` 

Quinto, è possibile inviare l'output di un comando all'ingresso di un altro utilizzando il pipe character (|):

seq 5 | sort 
+0

Questo è stato molto utile. Ho capito la maggior parte del compito ora e ho semplicemente bisogno di capire come memorizzare tutte queste stringhe per ordinarle alfabeticamente. –

+0

@Kyle: guarda i nuovi suggerimenti. – outis

+0

Grazie mille, apprezzo molto l'aiuto. Mi piace la semplicità della tua funzione tail(). –

3

per iniziare, controlla la read incorporato:

while read first_word rest_of_the_line; do 
    ... your code here ... 
done 

È inoltre necessario un modo per alimentare il file di input in tale ciclo.

+0

Grazie mille, apprezzo l'aiuto. –

0

L'espansione dei parametri consente di ritagliare parti di una variabile.

0

questa è una breve dimostrazione. Passa attraverso le parole, ottieni l'ultima parola e mettila davanti alla stringa. fino a quando la stringa finale è la stessa dell'originale.

#!/bin/bash  
    s="Software Requirements Analysis" 
    org="$s" 
    while true 
    do 
     last=${s##* } #Analysis 
     front=${s% *} #Software Requirements 
     s="$last $front" 
     echo $s 
     case "$s" in 
     "$org") break;; 
     esac 
    done 

si dovrebbe essere in grado di fare il resto utilizzando un file.

+0

Se volevo che rimuovesse la prima parola e la aggiungessi alla fine, quali cambiamenti dovrei apportare alle seguenti due righe? ultimi = $ {s} ## * #Analysis anteriore = $ {s}% * Requisiti #Software Non capisco quello che la s ## * e s% * significa. Grazie mille per la risposta, è anche molto utile. –

+0

Non spazia le righe correttamente nel commento, mi dispiace per il fatto che sia così disordinato. –

+0

vedere qui: http://en.tldp.org/LDP/abs/html/string-manipulation.html in 'rimozione della sottostringa' per esempi. dovresti essere in grado di avere un'idea di come funziona e fare il necessario da te. – ghostdog74

2

Lasciatemi permetto visualizzare un esempio veloce di lavoro basato sulla @outis answer:

strings="string1 string2 string3" 
next() { echo $1; } 
rest() { shift; echo $*; } 
for i in $strings; do 
    echo $(next $strings) 
    strings=$(rest $strings) 
done 

o altro senso tutto, se siete interessati a attraversare in sequenza:

strings="string1 string2 string3" 
next() { echo $1; } 
rest() { shift; echo $*; } 
totalWords=$(c() { echo $#; }; c $strings) 
for i in `seq -w 1 $totalWords`; do 
    echo $i: $(next $strings) 
    strings=$(rest $strings) 
done 
+0

Come la semplicità delle funzioni next() e rest(); +1 – razzed

Problemi correlati