Intereting Posts
Использование BSD jot для создания файла со случайным контентом Поиск пути устройства USB Почему я не могу установить libc6-dev-amd64, используя официальные онлайн-репозитории? Как узнать, какие файлы находятся вне репозитория git Какова самая последняя методика реализации квот? поиск файлов с использованием группового разрешения Нужно ли мне эфемерное хранилище? Как читать '\ n' в переменную с помощью встроенной команды Bash? Экран GNU: как можно надежно возобновить сеанс экрана? предельные выходы awk Откуда система определяет временное имя хоста? Есть ли он-лайн / веб-интерфейс для поиска и списка пакетов apt-get и см. Резюме и рекомендации? почему моя первая операция с трубой не удаляла символ новой строки? Как запустить службу Systemd навсегда («Загрузка еще не завершена. Повторите попытку позже»). Простой способ просмотра содержимого каталогов в файловых системах Linux / UNIX

Замена части строки числами обратного отсчета с помощью команды sed

У меня есть строка: TestTest12312313 . Я хотел бы заменить число 13 в этой строке номерами обратного отсчета -1,-2,-3,-4, .... с помощью команды sed , поэтому вывод будет следующим:

 TestTest123123-1 TestTest123123-2 TestTest123123-3 TestTest123123-4 ..... ..... ..... 

Попробуй это:

Иметь следующий код в файле

 INPUT=$1 CONTENT=`echo "$INPUT" | cut -c1-14` COUNT=`echo "${INPUT#"$CONTENT"}"` for i in $(seq 1 "$COUNT") do echo "$CONTENT-$i" done 

Запустите скрипт с вводом времени выполнения, как показано ниже:

 sh file.sh TestTest12312313 TestTest123123-1 TestTest123123-2 TestTest123123-3 TestTest123123-4 TestTest123123-5 TestTest123123-6 TestTest123123-7 TestTest123123-8 TestTest123123-9 TestTest123123-10 TestTest123123-11 TestTest123123-12 TestTest123123-13 

пытаться

 string='TestTest12312313' printf '%s\n' ${string%??}-{1..100} 

${parameter%word} является расширением параметра оболочки и удаляет последние два символа из его параметра.


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

Если вы хотите повторить печать строки с двумя последними цифрами, которой заканчивается ваша строка , вы можете сделать следующее:

 string='testString07' eval printf '%s\\n' ${string%??}-{1..${string:((${#string}-2))}} testString-01 testString-02 testString-03 testString-04 testString-05 testString-06 testString-07 

Этот синтаксис ${string:((${#string}-2))} исходит из расширения ${parameter:startPosition:length} оболочки ${parameter:startPosition:length} (если length не startPOsition он вернется из startPOsition в конец.) Где startPosition is ((${#string}-2)) , что возвращает длину в символах его string как параметр минус 2.

Ну, это было бы также упрощено до:

 eval printf '%s\\n' ${string%??}-{1..${string#${string%??}}} 

если это файл, а не одна строка, я бы предложил использовать awk здесь следующим образом:

 awk -F'..$' '{print $1"-"NR}' infile 

это установка разделителя полей awk с двумя последними символами каждой строки (это ..$ регулярное выражение, которое соответствует только двум символам в конце строки), а затем мы печатаем первое поле и его номер R ecord, разделенного дефис. Это было бы сокращено до:

 awk -F'..$' '$0=$1"-"NR' infile 

С awk :

 $ echo 'TestTest12312313' | awk '{ s = substr($0, 1, length - 2); while (1) printf("%s-%d\n", s, ++n) }' TestTest123123-1 TestTest123123-2 TestTest123123-3 TestTest123123-4 TestTest123123-5 TestTest123123-6 TestTest123123-7 TestTest123123-8 TestTest123123-9 (etc., forever...) 

Код awk извлекает строку ввода (вашу строку) и удаляет последние два символа, сохраняя результат в переменной s . Затем он входит в бесконечный цикл, который печатает эту строку вместе с постоянно увеличивающимся целым числом в формате, показанном выше.

Вы можете сделать это используя следующий вкладыш:

 $ a=1; for i in $(sed 's/13$//' inputfile);do echo "${i}-$((a++))"; done TestTest123123-1 TestTest123123-2 TestTest123123-3 TestTest123123-4 TestTest123123-5 TestTest123123-6