Ссылка
Как я могу избежать метасимволов, когда я интерполирую переменную в операторе сопоставления 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
но мне нужно интерпретировать только это. Таким образом, ни одна строка не удаляется.
Это кажется довольно сложной проблемой для решения, но я надеюсь, что вы можете мне помочь.
Я нашел решение:
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" есть вероятность, что любые подменные, начинающиеся с "$", "@" или "%", будут раскрыты?
Вероятно, самый простой (и наиболее надежный) способ - это экспортировать переменную в среду оболочки, а затем получить к ней доступ через хэш ENV
. Таким образом, вам не нужно полагаться на синтаксический анализ оболочки $ var
внутри выражения perl и можно использовать одинарные кавычки вместо двойных:
$ export var='*'
$
$ printf '%s\n' foo \* baz | perl -ne 'print unless /\Q$ENV{"var"}\E/'
foo
baz
] Вы можете использовать флаг 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
# ............................^^^^^^^^^^^^^^