удаление выражения case: расширение bash в sed regexp: X = 'a \ .b';Y = ';;'sed -n '/ $ {X} /, / $ {Y} / d' - PullRequest
2 голосов
/ 09 июня 2010

Я пытаюсь удалить предложение case из bash-скрипта.Предложение будет отличаться, но всегда будет иметь обратную косую черту как часть строки соответствия регистра.

Я пробовал sed, но мог использовать однострочник awk или perl в скрипте bash.

Цель редактирования проста, напоминает:

 $cat t.sh
 case N in 
 a\.b); 
   #[..etc., varies] 
 ;;
 esac

Я сталкиваюсь с переменным расширением, избегая обратной косой черты, точки с запятой или обоих.Если я 'eval', я убираю свои побеги.Если я этого не сделаю, точки с запятой меня догонят.Так что я попробовал расширение subshell внутри sed.Это загрязняет переводчика, как я это написал.Дальнейшее спасение от точек с запятой, похоже, не поможет.

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

Ответы [ 2 ]

0 голосов
/ 10 июня 2010

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. Одинарные кавычки будут препятствовать расширению переменных и подстановке команд. Когда они не используются, обычно лучше использовать одинарные кавычки.

0 голосов
/ 10 июня 2010
X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh

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

...