Ничто не сравнится с циклом при чтении
при обработке текста, но на всякий случай вы хотите обработать свой datafile.tsv
только один раз :
sed 's|\(.*\)|1s/genes/\1.Corrected/|' names.in | sed -f - datafile.tsv
Первый sed
превращает names.in
в сценарий sed :
1s/genes/name1.Corrected/
1s/genes/name2.Corrected/
1s/genes/name3.Corrected/
1s/genes/name4.Corrected/
1s/genes/name5.Corrected/
, который затем выполняется вторым sed
.
Если все ваши столбцы генов расположены подряд (как в вашем примере ввода), вы также можете запустить:
tr \\n \\t
, который похож на первый, как последний sed
выполняет следующий сценарий sed :
1s/genes.*genes/name1.Corrected name2.Corrected name3.Corrected name4.Corrected name5.Corrected/
Обратите внимание, что он не будет редактировать ваш файл на месте. Для этого либо используйте sed
с -i
(если поддерживается), либо перенаправьте >
вывод, например, на newfile
затем mv newfile datafile.tsv
Взгляните на свою функцию. В этом примере я изменил некоторые имена, чтобы обвинить виновных, и сделал несколько неуместных с вашей проблемой:
recurse{} (
recurse "$@"
}
Как вы думаете, что это сделает при вызове?
Чтобы исправить это, вы можете вызвать явный двоичный файл:
emacs () {
if [ $TERM != "xterm" ]
then
TERM=xterm /usr/bin/emacs "$@"
else
/usr/bin/emacs "$@"
fi
return;
}
Или вы можете положиться на правильную настройку пути:
emacs () {
if [ $TERM != "xterm" ]
then
TERM=xterm command emacs "$@"
else
command emacs "$@"
fi
return;
}
alias emacs='TERM=xterm emacs'
Думаю, это все, что вам нужно. Он безоговорочно устанавливает TERM
в xterm
и запускает emacs
.
Если вы хотите сделать это только вtmux
:
emacs () {
if [ -n "$TMUX" ]; then
TERM=xterm command emacs "$@"
else
command emacs "$@"
fi
}
Здесь используется рекурсивный вызов функции с command
по , а не . Это не нужно в псевдониме. В этой функции также нет необходимости return
.