Я могу указать перенаправленный вход перед составной командой?

Визуально выделите текст в скобках:

Ctr+V2jl

Увеличьте каждое число пять:

:norm 5Объяснение Ctr+V Ctr+A:

:norm выполняет целую команду в нормальном режиме. Ctr+V необходим, иначе курсор перешел бы назад к началу строки. Ctr+A увеличивает число 1, и это сделано 5 раз. Визуальный диапазон вставляется автоматически после нажатия двоеточия.

Править: Как Stephane правильно указал, предыдущий код увеличивает первое число, найденное на любой строке. Вот лучшее решение:

%s/\[\zs\d\+\ze\]/\=(submatch(0)+5)

Это добавляет пять ко всем целым числам в скобках. \zs и \ze используются для исключения скобок из соответствия и submatch возвращает подобранное число.

8
17.09.2014, 23:57
4 ответа

Человек Bash говорит:

... Операторы перенаправления могут предшествовать или появиться в любом месте в Simple Command или могут следовать команде.

В то время как не простая команда.

11
27.01.2020, 20:08

Вы можете в zsh , а не в bash и choroba уже указала вам на документацию , но если хотите чтобы иметь перенаправление раньше, вы можете сделать что-то вроде:

< file eval '
  while IFS= read -r line; do
    ...
  done'

Или (в системах с поддержкой / dev / fd / n ):

< file 3<< 'EOF' . /dev/fd/3
while IFS= read -r line; do
  ...
done
EOF

(не то, что вы хотели бы это сделать) .

Вы также можете:

exec 3< file
while IFS= read -r line <&3; do
  ...
done
exec 3<&-

(обратите внимание, что exec завершит сценарий, если файл не может быть открыт).

Или используйте функцию:

process()
  while IFS= read -r line; do
    ...
  done

< file process
6
27.01.2020, 20:08

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

cat lines | while read line; do echo "line: $line"; done
3
27.01.2020, 20:08

Вы можете использовать exec для перенаправления stdin.

В скрипте:

exec < <(cat lines)
while read line ; do echo "line: $line"; done

Однако вы не можете использовать в оболочке для входа в систему (она сбросит файл в stdout и выйдет). В этом случае вы можете открыть другой дескриптор файла:

exec 3< <(cat lines)
while read -u 3 line ; do echo "line: $line"; done

Для справки: Используя exec

2
27.01.2020, 20:08

Теги

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