Удаление пункта: расширение Bash в Sed Regexp: x = 'a .b'; Y = ';;' Sed -n '/ $ {x} /, / $ {y} / d'

StackOverflow https://stackoverflow.com/questions/3009202

Вопрос

Я пытаюсь удалить предложение обзора из сценария 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

Это играет в игры с цитатой оболочки, но это работает довольно хорошо. :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top