Самый простой способ — сначала удалить все экземпляры XYZ12-
и заменить первый -
на-XYZ12-
:
$ echo 20170223_LibError.log-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz | sed -E 's,XYZ12-,,g' | sed 's,-,-XYZ12-,'
20170223_LibError.log-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
РЕДАКТИРОВАТЬ:Если вы не знаете XYZ12
заранее, вы можете извлечь его, используя cut
. Например, создайте do.sh
такой скрипт:
#!/usr/bin/env sh
pattern=$(echo "$1" | cut -d- -f2)
echo "$1" | sed -E "s,$pattern-,,g" | sed "s,-,-$pattern-,"
Использование:
$./do.sh 20170223_LibError.log-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
20170223_LibError.log-XYZ12-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
И с другим узором:
$./do.sh 20170223_LibError.log-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-NMNM-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
20170223_LibError.log-NMNM-SAE066.log_compressed_at_2017-09-27_03-32-55.gz
Я ничего не упоминаю, даже экспортную директиву .
FREESURFER_HOME=freesurfer
В других языках это было бы просто $FREESURFER_HOME = "freesurfer"
, присвоение строки. В bash вы решаете при каждом использовании, имеете ли вы в виду строку или значение переменной
$ echo FREESURFER_HOME
FREESURFER_HOME
$ echo $FREESURFER_HOME
freesurfer
Знак доллара — это способ сообщить bash, что вы имеете в виду значение/содержимое этого имени.
После установки переменной вы можете использовать ее (со знаком доллара)
source $FREESURFER_HOME/SetUpFreeSurfer.sh
— это то, для чего вам нужна эта переменная. Вы хотите запустить/использовать определенный скрипт в модифицированном домашнем каталоге fs -. Для одного вызова это точно так же, как source freesurfer/SetUpFreeSurfer.sh
, если "freesurfer" является содержимым.
Если вы наберете $FREESURFER_HOME
в качестве команды, (первое слово будет командой! ), оно расширяется до своего значения "freesurf" (или любого другого значения ), и это не существующая команда (-> не найдена ).
В других ситуациях с допустимыми командами в переменных случались плохие вещи.
$ cmd='echo hello'
$ $cmd
hello
Здесь ничего не происходит, это дружественная команда --, но этот вид алиасинга по крайней мере вызывает сомнения. Я думаю, никто этого не делает, это было бы разрушительным . Для обычного псевдонима есть дополнительный встроенный -в:
$ alias cmd='echo hello'
$ cmd
hello
(Здесь нет $
знака --намного лучше!)
(Экспорт может потребоваться для распространения переменной. Нисколько не меняет этих фактов. Положил его обратно!)