Извлеките число в каждой строке и добавьте к нему другое число

Вы получили сообщение об ошибке sudo: no tty present, потому что ssh не выделяет автоматически устройство tty, когда вы находитесь в неинтерактивном режиме. т.е. вы указали команду для выполнения на удаленной системе.

Вы можете заставить ssh выделить устройство tty, используя опцию -t.

ssh -t user@ip "sudo tar zc -C /home/minecraft/multicraft/servers/server2 ." | tar zx
2
16.03.2018, 03:58
3 ответа

Вот решение GNU awk:

awk  '/^ *\(/{print}!/^ *\(/{split($1,aa,"[0-9]+",bb);printf "\"#%s\" )\n", bb[length(bb)]+1}'

или аналогичный, но разделенный на несколько строк для удобства чтения:

awk  '/^ *\(/ { print }
     !/^ *\(/ { split( $1, aa, "[0-9]+", bb )
                printf "\"#%s\" )\n", bb[length(bb)]+1 }'
  1. /^ *\и !/^ *\(/— два правила адресации, охватывающие строки, начинающиеся с необязательных пробелов и открывающей круглой скобки... и строки без них.

  2. split( $1, aa, "[0-9]+", bb )Для строк, которые этого не делают, разделите строку на два массива. aa— это содержимое строки, ограниченное регулярным выражением «[0 -9]+», а bb— разделители, соответствующие регулярному выражению. Последний элемент bb— это то, что вас интересует.

  3. printf "\"#%s\" )\n"форматирует строку вывода, ожидая одну переменную...

  4. bb[length(bb)]+1единица плюс значение последнего элемента bb.

1
27.01.2020, 21:52

Это больше работа дляperl:

perl -pe 's/"#\K.*?(\d+)\.djvu(?=")/$1+1/ge' <file

С переменной:

INCR=1 perl -pe 's/"#\K.*?(\d+)\.djvu(?=")/$1+$ENV{INCR}/ge' <file

Или:

perl -spe 's/"#\K.*?(\d+)\.djvu(?=")/$1+$incr/ge' -- -incr=1 <file
5
27.01.2020, 21:52
gawk '{
    sub(/#.*\.djvu/, "#" $1 + 1 ".djvu")
    print
}' FPAT='[0-9]+\.djvu' input.txt

Идея следующая:

  • извлечь расширение .djvuс начальными цифрами из имени файла djvu, используя шаблон [0-9]+\.djvu(FPAT). Пример:исходное имя файла — #all_24223_to_00243.cpc0002.djvu, извлеченная часть будет 0002.djvu.
  • заменить предыдущее djvuимя файла #.*\.djvuна извлеченное, предварительно увеличив его на 1. Пример:взять целую строку $0и подставить #all_24223_to_00243.cpc0002.djvuвнутри нее, чтобы0002.djvu + 1(это выражение приводило к обычному числу 3, из-за того, как работает преобразование строки в число в gawk). Добавьте к нему знак #и расширение .djvu. Результат:#3.djvu.

Это решение будет работать только для строк с одним именем файла djvu, как в вашем образце ввода.

Вход

(bookmarks
 ("Cover"
  "#01.djvu" )
 ("Title page"
  "#all_24223_to_00243.cpc0002.djvu" )
 ("Preface"
  "#all_24223_to_00243.cpc0004.djvu" )

Выход

(bookmarks
 ("Cover"
  "#2.djvu" )
 ("Title page"
  "#3.djvu" )
 ("Preface"
  "#5.djvu" )
1
27.01.2020, 21:52

Теги

Похожие вопросы