如何提取不同引号间的字符串?scanimage设备地址提取的正则困惑
从scanimage输出提取设备地址的grep命令转义方案
场景说明
scanimage -L 命令的输出示例:
device `canon_dr:libusb:003:004' is a CANON DR-C125 scanner
需要提取其中的设备地址 canon_dr:libusb:003:004。
原命令的问题与解决
你尝试的命令grep -Po '\K[^']+'`存在单引号转义问题,以下是两种正确写法:
写法一:单引号包裹正则,转义内部单引号
scanimage -L | grep -Po '`\K[^'\''']+'
在单引号包裹的字符串中,要表示单引号需用'\'':先关闭当前单引号,用\'输出单引号,再重新打开单引号继续写正则。
写法二:双引号包裹正则
scanimage -L | grep -Po "`\K[^']+"
双引号内的单引号无需转义,这里的反引号作为正则匹配的普通字符,不会触发shell的命令替换(无变量或命令嵌套场景),可以直接使用。
正则逻辑说明
\K:Perl正则特性,忽略之前匹配的反引号内容,只返回后面匹配的部分[^']+:匹配所有非单引号的字符,直到遇到下一个单引号为止,正好提取出设备地址
内容的提问来源于stack exchange,提问作者Ilyasha
相关产品推荐
相关产品推荐

