Re: Как я могу избежать метасимволов, когда я интерполирую переменную в операторе сопоставления Perl?

Ссылка

Как я могу избежать метасимволов, когда я интерполирую переменную в операторе сопоставления Perl?

мне не помог.

Я пробовал с Python:

import os
line='ID_SN=02      MS=DC:A6:32:7E:74:08    S=*     TS=24/11/2020 11:02:30 CET      N=IMC2500       MD=7F:7A:25:43:8F:44    T=LE    P=90@'
cmd1="perl -sni -e 'print unless /^\Q$regex\E$/' -- -regex=%s device_scan.txt" % repr(line)
os.system(cmd1)

Но \ Q ... \ E также блокирует интерпретацию \ t но мне нужно интерпретировать только это. Таким образом, ни одна строка не удаляется.

Это кажется довольно сложной проблемой для решения, но я надеюсь, что вы можете мне помочь.

0
задан 25 November 2020 в 16:15

3 ответа

Я нашел решение:

import os
line='ID_SN=02      MS=DC:A6:32:7E:74:08    S=*     TS=24/11/2020 11:02:30 CET      N=IMC2500       MD=7F:7A:25:43:8F:44    T=LE    P=90@'
cmd1='perl -sni -e \'print unless /^\Q$regex\E$/\' -- -regex=\'%s\' device_scan.txt' % line.replace("'","'\"'\"'")
os.system(cmd1)

Но у меня к вам вопрос, @steeldriver. В этом случае внутри переменной perl "$ regex" есть вероятность, что любые подменные, начинающиеся с "$", "@" или "%", будут раскрыты?

0
ответ дан 3 January 2021 в 22:48

Вероятно, самый простой (и наиболее надежный) способ - это экспортировать переменную в среду оболочки, а затем получить к ней доступ через хэш ENV . Таким образом, вам не нужно полагаться на синтаксический анализ оболочки $ var внутри выражения perl и можно использовать одинарные кавычки вместо двойных:

$ export var='*'
$ 
$ printf '%s\n' foo \* baz | perl -ne 'print unless /\Q$ENV{"var"}\E/'
foo
baz
0
ответ дан 3 January 2021 в 22:48

] Вы можете использовать флаг perl -s , который действует аналогично опции -v в awk

perl -i -sne 'print unless /^\Q$regex\E$/' -- -regex="$var" device_scan.txt

- после -e 'body' требуется, чтобы -regex не использовался как параметр perl , он оставлен для тела.

Кроме того, -e body теперь заключено в одинарные кавычки, чтобы переменная perl не попадала в оболочку

Используя пример @ steeldriver:

$ var='*'
$ perl -sne 'print unless /\Q$regex\E/' -- -regex="$var" <(
    printf '%s\n' foo 'bar * baz' qux
  )
foo
qux

Другой способ обойти это - использовать расширение параметра оболочки, чтобы избежать косой черты. Ясно, что это становится беспорядочным:

perl -ni -e "print unless /^\Q${var//\//\\/}\E$/" device_scan.txt
# ............................^^^^^^^^^^^^^^
2
ответ дан 3 January 2021 в 22:48

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

Похожие вопросы: