链接
当我在 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
但我只需要解释这一点。所以没有删除任何行。
这似乎是一个相当复杂的问题,但我希望你能帮助我。
答案1
您可以使用 perl 的-s
标志,其作用类似于 awk 的-v
选项
perl -i -sne 'print unless /^\Q$regex\E$/' -- -regex="$var" device_scan.txt
以下是必需的--
,-e 'body'
因此-regex
不会被视为perl选项,它留给身体。
此外,-e
主体现在用单引号引起来,以使 perl 变量远离 shell
使用@steeldriver 的示例:
$ var='*'
$ perl -sne 'print unless /\Q$regex\E/' -- -regex="$var" <(
printf '%s\n' foo 'bar * baz' qux
)
foo
qux
另一种解决方法是使用 shell 参数扩展来转义斜杠。显然这会变得很混乱:
perl -ni -e "print unless /^\Q${var//\//\\/}\E$/" device_scan.txt
# ............................^^^^^^^^^^^^^^
答案2
可能最简单(也是最可靠)的方法是出口将变量放入 shell 的环境中,然后通过哈希访问它ENV
。这样,您就不需要依赖 shell 解析$var
里面perl 表达式可以使用单引号代替双引号:
$ export var='*'
$
$ printf '%s\n' foo \* baz | perl -ne 'print unless /\Q$ENV{"var"}\E/'
foo
baz
答案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”中,是否有可能扩展以“$”或“@”或“%”开头的任何子变量?