Вы можете использовать Vim в режиме Ex:
ex -s -c '%s/a/b/g|x' file
%
выбрать все строки
s
заменить
g
глобальную замену
x
сохранить и закрыть
У тебя получится:
#! /bin/zsh
TMPPREFIX=${TMPDIR:-/tmp}/atom.
(){ide --file=$1} =(print -r -- "$@")
И вызвать его как:
that-script "$(cmd)"
Кавычки необходимы, иначе оболочка разделит вывод $cmd
на $IFS
символов. Вот только для NL, SPC, TAB и NUL (значение по умолчанию $IFS
), кавычки, обратные кавычки и т. д. не являются проблемой.
Но это больше печатать, чем делать напрямую:
ide --file =(cmd)
Или если это должно быть ide --file=file
вместоide --file file
:
(){ide --file=$1} =(cmd)
=(cmd)
— это специфическая для zsh -форма подстановки процессов, которая использует временный файл вместо канала (для<(...)
). (){code} args
— анонимная функция.
Обратите внимание, что для вывода содержимого $1
, за которым следует новая строка, используется следующий синтаксис::
printf '%s\n' "$1" # POSIX
print -r -- "$1" # ksh/zsh
echo -E - $1 # zsh only
Не echo $1
, который не работал бы должным образом, если бы $1
содержал обратную косую черту или был чем-то вроде -n
, -
, -Enenne
... См. Почему printf лучше, чем echo? для получения подробной информации.
Ваш скрипт, модифицированный:
#!/bin/sh
TEMPFILE=$(mktemp /tmp/atom.XXXX)
cat >"$TEMPFILE"
ide --file="$TEMPFILE"
Вы бы использовали это как
node main.js |./myscript.sh
Это передает вывод команды node
на стандартный ввод вашего скрипта. Затем сценарий просто перенаправляет свой стандартный ввод во временный файл.
Как вариант,
#!/bin/sh
TEMPFILE=$(mktemp /tmp/atom.XXXX)
printf '%s\n' "$1" >"$TEMPFILE"
ide --file="$TEMPFILE"
и используйте скрипт как
./myscript "$( node main.js )"
(обратите внимание на двойные кавычки и использованиеprintf
)
Я знаю, что переключился на /bin/sh
в приведенных выше примерах, но вы, похоже, не используете какую-либо особенно продвинутую функцию zsh
, поэтому я подумал, что это будет нормально.
Связанные: