Расширение имен переменных в строках с двойными кавычками является сложным в tcsh. В вашей команде:
sed -i "s/^${y}$//g" $x
значение оболочки или переменное окружения $y
должно быть расширено правильно, но оболочка будет пытаться расширить $/
до значения $/
, который, как говорится в сообщении об ошибке нелегального имя переменного ,
Ваша вторая команда:
sed 's/^'"${y}"'$//g' $x
является почти правильно; это просто отсутствует аргумент -i
для sed
.
Это должно работать: . СЕПГ 's/^' "$ {у}" '$ // г' $ х
{
и }
вокруг y
не нужны в этом случае, так что вы могли бы написать:
sed 's/^'"${y}"'$//g' $x
Или вы можете сделать это следующим образом:
sed -i "s/^$y"'$'"//g" $x
Эта последняя версия переходит от двойных кавычек в одинарные кавычки, и обратно в два раза, просто вокруг $
характера. Это вопрос акцента, хотите ли вы использовать одинарные кавычки только вокруг $
, которые вы не хотите расширять, или использовать двойные кавычки только вокруг $y
, которые вы хотите расширить.
Еще более просто, вы можете избежать $
символа в двойных кавычках, предварив его \
(я думаю, что может быть специфическими для Tcsh, оригинальный CSH не мог бы быть в состоянии сделать это). Так что я думаю, что это предпочтительный подход - если у вас есть Tcsh, а не старый стиль CSH:
sed -i "s/^$y\$//g" $x
Я предполагаю, что вы хотите сделать, это обновление файл с именем $x
на месте, вычеркивание строка, содержащаяся в $y
в начале каждой строки. Кажется, это то, что вы пытаетесь сделать, но я не могу быть уверен.