Удаление пункта: расширение Bash в Sed Regexp: x = 'a .b'; Y = ';;' Sed -n '/ $ {x} /, / $ {y} / d'
-
26-09-2019 - |
Вопрос
Я пытаюсь удалить предложение обзора из сценария Bash. Пункт будет варьироваться, но всегда будет иметь обратную косание как часть строки Case-Match.
Я пытался SED, но мог использовать awk или Perl одноклассник в скрипте Bash.
Цель редактирования простой, напоминает:
$cat t.sh
case N in
a\.b);
#[..etc., varies]
;;
esac
Я бегу в Appoul из переменных расширения, выходящих на обратную косание, запястья или обоих. Если я «Eval», я разбираю мою обратную челюсть, убегает. Если я этого не сделаю, полукольны поймают меня. Итак, я попробовал расширение подпунктов в сед. Это нарушает интерпретатор, как я его написал. Подробнее сбежав в полуобывании, похоже, не помогает.
X='a\.b' ; Y=';;'
sed -i '/$(echo ${X} | sed -n 's/\\/\\\\/g')/,/$(echo ${Y} | sed -n s/\;/\\;/g')/d t.sh
И это:
perl -i.bak -ne 'print unless /${X}/ .. /{$Y}/' t.sh # which empties t.sh
а также
eval perl -i.bak -ne \'print unless /${X}/ .. /{$Y}/' t.sh # which does nothing
Решение
Bash's. printf
имеет функцию цитирования, которая поможет:
X='a\.b'; Y=';;'
sed "/$(printf "%q" "$X")/,/$(printf "%q" "$Y")/d" t.sh
или вы можете дополнительно использовать printf
Функция переменных заданий:
printf -v X "%q" 'a\.b'
printf -v Y "%q" ';;'
sed "/$X/,/$Y/d" t.sh
Обратите внимание на использование двойных кавычек вокруг sed
аргумент команд. Одиночные кавычки предотвратит расширение переменных и замены команды. Когда те, кто не используются, хотя обычно лучше использовать отдельные цитаты.
Другие советы
X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh
Это играет в игры с цитатой оболочки, но это работает довольно хорошо. :)