Как поменять номер позиции, например, с 4-й позиции на 7-ю? - PullRequest
0 голосов
/ 09 февраля 2019

Пример номера:

12345678

Моя попытка:

sed 's/\(.\)\(.\)/\2\1/'

Мой результат:

21345678

Эта строка поменяет местами первую и вторую позициичисла.Я пока не могу понять, как поступить с дальнейшей позицией.

Ответы [ 5 ]

0 голосов
/ 09 февраля 2019

С помощью sed, который поддерживает ERE с помощью опции -E, например, GNU sed и OSX / BSD sed:

$ echo '12345678' | sed -E 's/(.{3})(.)(.{2})(.)/\1\4\3\2/'
12375648
0 голосов
/ 09 февраля 2019

Это может сработать для вас (GNU sed):

sed -E 's/./\n&/7;s//\n&/4;s/\n(.)(.*)\n(.)/\3\2\1/' file

Введите новую строку в позициях символов и используйте сопоставление с образцом для замены этих символов.

NB Нормальный потокзамена должна быть отменена, иначе введенный символ новой строки повлияет на длину исходной строки.

0 голосов
/ 09 февраля 2019

Вы можете поменять 4-ю и 7-ю буквы на:

sed 's/\([0-9]\{3\}\)\([0-9]\)\([0-9]\{2\}\)\([0-9]\)/\1\4\3\2/' <<< "12345678"

Вывод:

12375648
0 голосов
/ 09 февраля 2019

Кажется, что использовать намного чище awk:

$ echo 12345678 | awk '{t=$4; $4=$7; $7=t}1' FS= OFS=
12375648
0 голосов
/ 09 февраля 2019

Вам просто нужно изменить его, чтобы захватить больше групп, и вывести их в нужной последовательности:

sed 's/^(...)(.)(..)(.)/\1\4\3\2/'
#      |  |   |  |   |
#      |  |   |  |   +- digit #7(\4)
#      |  |   |  +----- 2 chars (\3)
#      |  |   +-------- digit #4 (\2)
#      |  +------------ 3 chars (\1)
#      +--------------- start-of-line anchor

Имейте в виду, что это для простейшего случая, когда вы просто хотите поменять местами символы независимо от того,будь то цифры или нет.Вы можете легко расширить классы персонажей, чтобы ограничить обмен местами, но мое намерение здесь состоит в том, чтобы просто показать самый простой способ добиться обмена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...