正则表达式将从磁铁链接获得标题:“未终止的地址正则表达式”

时间:2019-07-14 09:12:16

标签: regex linux sed

我正在尝试创建一个简单的shell脚本,以从磁性链接获取标题并将其写入 .out 文件。

如果我在下面的regex上regex101.com上试用,将会很受欢迎。查看屏幕截图。

&dn=(.*?)&

https://imge.to/i/Fw26r

问题是我一直都遇到以下错误: “未终止的地址正则表达式”。

我尝试了不同的选项,但结果相同:

u@d:~/Documents/tmp $ sed -e '\&dn=(.*?)\&$' magnet.txt >> magnet.out
sed: -e expression #1, char 13: unterminated address regex
u@d:~/Documents/tmp $ sed -E '\&dn=(.*?)\&' magnet.txt >> magnet.out
sed: -e expression #1, char 12: unterminated address regex
u@d:~/Documents/tmp $ cat magnet.txt | sed -e '\&dn=(.*?)\&i'
sed: -e expression #1, char 13: unterminated address regex
u@d:~/Documents/tmp $ sed -e '&dn=(.*?)&' magnet.txt >> magnet.out
sed: -e expression #1, char 1: unknown command: `&'

您能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

在结束定界符之前的反斜杠是错误的。第一个反斜杠必须说“我想使用与默认斜杠不同的定界符”,但是第二个反斜杠说“这是字面&符,而不是结束定界符”(因此sed希望正则表达式继续,并且在看不到结束定界符时抱怨。

只是地址表达式使sed完整打印匹配的行(第二次,不包含-n,因为默认行为是打印所有行),看来您想要&符是正则表达式的一部分,而不是正则表达式周围的定界符。如果要提取与号之间的字符串,则需要

sed -n 's/.*&dn=\([^&]*\)&.*/\1/p' magnet.txt

也就是说,只用提取的带括号的表达式替换整行,然后打印该行。

sed是一种脚本语言。除斜杠(和冒号和等号)以外的大多数命令都是单字母字母; s命令-这是许多人遇到的唯一命令-在文本中执行替换。

只需重申一下,您的原始脚本看起来就像

sed '/dn=.*?/'

使用自定义的&分隔符而不是/。这将查找包含dn=的行,后接任何内容,后接文字问号。默认操作是打印匹配的行,因此sed会将那些行打印两次(其他所有行仅打印一次)。

非贪婪量词.*?是Perl扩展名,在我熟悉的任何sed方言中都不支持;但是准确表达自己想要的东西实际上会更好(即使您确实可以使用非贪婪的量词)。