TCSH Shell Script: подставьте переменную, используя sed внутри файла

В моем сценарии tcsh у меня есть это

sed -i "s/^${y}$//g" $x

Как мне заставить это работать? либо я не получаю никаких изменений, либо какая-либо ошибка, например, Недопустимое имя переменной или Имя переменной, должна содержать буквенно-цифровые символы. Пробовал разные комбинации "". "внутри сед. пример

sed 's/^'"${y}"'$//g' $x

1 ответ

Решение

Расширение имен переменных в двойных кавычках сложно в tcsh. В вашей команде:

sed -i "s/^${y}$//g" $x

значение оболочки или переменной среды $y должен быть расширен правильно, но оболочка будет пытаться расширить $/ к стоимости $/, который, как говорится в сообщении об ошибке, является недопустимым именем переменной.

Ваша вторая команда:

sed 's/^'"${y}"'$//g' $x

почти правильно; это просто не хватает -i аргумент sed,

Это должно работать: sed 's/^'"${y}"'$//g' $x

{ а также } вокруг 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 в начале каждой строки. Кажется, это то, что ты пытаешься сделать, но я не уверен.

Другие вопросы по тегам