2010-04-05 11 views
6

Tengo una tarea en la que necesito tomar entrada de un archivo y eliminar continuamente la primera palabra de una línea y anexarla al final de la línea hasta que se hayan completado todas las combinaciones.¿Cómo hacer un desplazamiento circular de cadenas en bash?

Realmente no sé por dónde empezar y agradecería cualquier tipo de dirección.

La parte que me tiene confundida es que esto se supone que debe realizarse sin el uso de matrices. No solo estoy buscando a alguien que me resuelva el problema, solo estoy buscando una dirección.

muestra de entrada:

Pipes and Filters 
Java Swing 
Software Requirements Analysis 

muestra de salida:

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

similares: [¿Cómo Cómo puedo dividir una cadena en un delimitador en Bash?] (http://stackoverflow.com/q/918886/55075) al SO – kenorb

Respuesta

6

algunas curiosidades que deben ayudar: cuando se llama a una función con una cadena, la cadena se divide en varios argumentos (el positional parameters, nombrado $n, donde n son números enteros a partir de 1) sobre los personajes de la variable $IFS (que por defecto es espacios, tabuladores y saltos de línea)

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

$* and [email protected] le dará todos los parámetros posicionales, en orden.

En segundo lugar, la variable especial $# contiene la cantidad de argumentos para una función.

En tercer lugar, shift descarta el primer parámetro posicional y mueve todos los demás en uno.

function tail() { 
    shift 
    echo $* 
} 

En cuarto lugar, se puede capturar la salida de comandos y funciones usando `...` or $(...)

rest=`tail $*` 

En quinto lugar, se puede enviar la salida de un comando a la entrada de otro utilizando la pipe character (|):

seq 5 | sort 
+0

Esto fue muy útil. He descubierto la mayor parte de la tarea ahora y simplemente necesito descubrir cómo almacenar todas estas cadenas para ordenarlas alfabéticamente. –

+0

@Kyle: vea los nuevos consejos. – outis

+0

Muchas gracias, realmente agradezco la ayuda. Me gusta la simplicidad de tu función tail(). –

3

para que pueda empezar, echa un vistazo a la orden interna read:

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

También necesita una forma de alimentar su archivo de entrada en ese bucle.

+0

Muchas gracias, aprecio la ayuda. –

0

La ampliación del parámetro le permitirá cortar partes de una variable.

0

esto es una demostración corta. Repase las palabras, obtenga la última palabra y colóquela frente a la cadena. hasta que la cadena final sea la misma que la original.

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

debería poder hacer el resto usando un archivo.

+0

Si quisiera eliminar la primera palabra y anexarla al final, ¿qué cambios haría en las siguientes dos líneas? últimos = $ {s} * ## #Analysis delante = $ {s}% * Requisitos #Software No entiendo lo que la s ## s * y * significa%. Muchas gracias por su respuesta, también es muy útil. –

+0

No está espaciando mis líneas correctamente en el comentario, lo siento por ser tan desordenado. –

+0

ver aquí: http://en.tldp.org/LDP/abs/html/string-manipulation.html bajo 'removal' subcadena de ejemplos. deberías poder hacerte una idea de cómo funciona y hacer lo necesario por ti mismo. – ghostdog74

2

Déjame permito que le muestre un ejemplo rápido de trabajo basado en @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 de otra manera todo el año si usted está interesado en atravesar por secuencia:

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

Como la simplicidad de las funciones next() y rest(); +1 – razzed

Cuestiones relacionadas