Вы можете
awk '{$1=""; print (NF==4)?$0:$2; exit}' OFS= infile
Тернарный оператор условия (NF==4)?$0:$2
проверяет, было ли N число F полей равным 4 (, когда поля разделены пробелами(awk по умолчанию FS )), затем напечатайте всю строку $0
после того, как мы разделим первое поле $1=""
, иначе :
напечатайте файл #2 $2
.
Вы можете выполнить такую замену, используя \=
специальное выражение замены. Подробности см. в :help sub-replace-special
, но вот как может работать эта конкретная замена:
%s/\d\+/\=str2nr(submatch(0)) > 8 ? str2nr(submatch(0)) + 2 : submatch(0)
В замещающей части команды :substitute
, после \=
, submatch(0)
дает вам полное совпадение. Глобальная функция str2nr
преобразует это в число.
Если вы хотите, чтобы логика была более читаемой, вы можете извлечь ее в функцию:
function! IncrementNumber(number_string)
let number = str2nr(a:number_string)
if number > 8
let number += 2
endif
return number
endfunction
Вы можете поместить это в свой .vimrc
и настроить его, установить пороговое значение 8
в качестве параметра и т. д., а затем вызвать это в файле:
%s/\d\+/\=IncrementNumber(submatch(0))