2014-08-28 3 views
1

У меня есть эта строкаизменение позиции символа в строке Баш

E="ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

любая идея, как изменить положение букв со своим соседом, если пользователь не введет не

, и он будет продолжать изменение положения до пользователь доволен строкой ИЛИ имеет конец конца строки.

is the position of 1st correct? Y/N 
N 
E=BACDEFGHIJKLMNOPQRSTUVWXYZ 
*some of my code here* 
are u satisfied? Y/N 
N 

is the position of 2nd correct? Y/N 
N 
E=BCADEFGHIJKLMNOPQRSTUVWXYZ 
*some of my code here* 
are u satisfied? Y/N 
N 

is the position 3rd correct? Y?N 
Y 
E=BCADEFGHIJKLMNOPQRSTUVWXYZ 
*some of my code here* 
are u satisfied? Y/N 
N 

is the position 4th correct? Y?N 
Y 
E=BCADEFGHIJKLMNOPQRSTUVWXYZ 
*some of my code here* 
are u satisfied? Y/N 
Y 

*exit prog* 

всяческая помощь будет принята с благодарностью. спасибо

отредактировано Я получил этот код с форума. работал отлично. но любая идея, как поменять следующий символ после того, как он сделал один раз? например, я сделал первую позицию, и я хочу запустить ее для второго символа? Есть идеи?

dual=ETAOINSHRDLCUMWFGYPBVKJXQZ 
phrase='E' 
rotat=1 
newphrase=$(echo $phrase | tr "${dual:0:26}" "${dual:${rotat}:26}") 
echo ${newphrase} 
+0

К вашему редактирования: что, если вы говорите, 'rotat = 2'? Кроме того, укажите, что именно вы хотите в качестве вывода, чтобы сделать его более понятным. – fedorqui

+0

Ответ г-на Тима достаточно хорош для меня. плохо использовать его код. Спасибо за помощь. хороший день sir –

ответ

3

Вам понадобится использовать петлю.

#!/bin/bash 

E="ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
echo "$E" 

for ((i = 1; i < ${#E}; i++)); do 
    echo "Is position $i correct? Y/N" 
    read answer 

    if [ "$answer" == "N" -o "$answer" == "n" ] 
    then 
    E="${E:0:$i-1}${E:$i:1}${E:$i-1:1}${E:$i+1}" 
    fi 

    echo "$E" 
    echo "Are you satisfied? Y/N" 
    read answer 

    if [ "$answer" == "Y" -o "$answer" == "y" ] 
    then 
    break 
    fi 
done 

Цикл итерации по каждому символу строки. Изменение строки происходит в первом условии if. Это не что иное, как основные операции подстроки. ${E:n} возвращает подстроку E, начиная с позиции n. ${E:n:m} возвращает следующие m символов E, начиная с позиции n. Остальные строки - это обработка, если пользователь удовлетворен и хочет выйти.

+0

спасибо, что это именно то, что мне нужно. головные уборы. большое спасибо. я очень ценю это!! –

+2

Я не знал, что вы можете опустить арифметическое расширение в синтаксисе подстроки. Приятно знать! – Bentoy13

1

С bash, вы можете извлечь подстроку легко:

${string:position:length} 

Этот синтаксис позволяет использовать различные расширения, поэтому довольно просто поменять местами два consective символов в строке:

E="${dual:0:$rotat}${dual:$((rotat+1)):1}${dual:$rotat:1}${dual:$((rotat+2))}" 

Arithmetics может потребоваться вставить в $((...)).

+0

Согласно моему опыту, по умолчанию в этом случае автоматически выполняется арифметика (извлечение подстроки) и индекс массива (например, $ {ARR [2 * 4 + 1]}). Поэтому $ ((...)) не требуется - на самом деле, знак $ для ссылки на имя переменной не нужен. – Jdamian

+1

@Jdamian Действительно, я не знал об этой функции; Я оставляю комментарий в ответ [Тим Циммерманн] (http://stackoverflow.com/a/25543896/1507014) в этом смысле. – Bentoy13

0

С Баш человека страниц:

${parameter:offset} 
    ${parameter:offset:length} 
      Substring Expansion. Expands to up to length characters of parameter starting at the character specified by offset. If 
      length is omitted, expands to the substring of parameter starting at the character specified by offset. length and offset are 
      arithmetic expressions (see ARITHMETIC EVALUATION below). length must evaluate to a number greater than or equal to zero. If 
      offset evaluates to a number less than zero, the value is used as an offset from the end of the value of parameter. If param- 
      eter is @, the result is length positional parameters beginning at offset. If parameter is an array name indexed by @ or *, 
      the result is the length members of the array beginning with ${parameter[offset]}. A negative offset is taken relative to one 
      greater than the maximum index of the specified array. Note that a negative offset must be separated from the colon by at 
      least one space to avoid being confused with the :- expansion. Substring indexing is zero-based unless the positional parame- 
      ters are used, in which case the indexing starts at 1. 

Примеры:

pos=5 
E="ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
echo "${E:pos:1} # print 6th character (F) 
echo "${E:pos} # print from 6th character (F) to the end 

Что ДОУ вы имеете в виду, когда вы говорите "соседа"? За исключением первого и последнего символов, каждый символ в строке имеет двух соседей.

Для обмена "POS" характер (начиная с 1) и его следующий (POS + 1):

E="${E:0:POS-1}${E:POS:1}${E:POS-1:1}${E:POS+1}" 
Смежные вопросы