我正在尝试创建一个简单的shell脚本,以从磁性链接获取标题并将其写入 .out 文件。
如果我在下面的regex上regex101.com上试用,将会很受欢迎。查看屏幕截图。
&dn=(.*?)&
问题是我一直都遇到以下错误: “未终止的地址正则表达式”。
我尝试了不同的选项,但结果相同:
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: `&'
您能指出我正确的方向吗?
答案 0 :(得分:2)
在结束定界符之前的反斜杠是错误的。第一个反斜杠必须说“我想使用与默认斜杠不同的定界符”,但是第二个反斜杠说“这是字面&符,而不是结束定界符”(因此sed
希望正则表达式继续,并且在看不到结束定界符时抱怨。
只是地址表达式使sed
完整打印匹配的行(第二次,不包含-n
,因为默认行为是打印所有行),看来您想要&符是正则表达式的一部分,而不是正则表达式周围的定界符。如果要提取与号之间的字符串,则需要
sed -n 's/.*&dn=\([^&]*\)&.*/\1/p' magnet.txt
也就是说,只用提取的带括号的表达式替换整行,然后打印该行。
sed
是一种脚本语言。除斜杠(和冒号和等号)以外的大多数命令都是单字母字母; s
命令-这是许多人遇到的唯一命令-在文本中执行替换。
只需重申一下,您的原始脚本看起来就像
sed '/dn=.*?/'
使用自定义的&
分隔符而不是/
。这将查找包含dn=
的行,后接任何内容,后接文字问号。默认操作是打印匹配的行,因此sed
会将那些行打印两次(其他所有行仅打印一次)。
非贪婪量词.*?
是Perl扩展名,在我熟悉的任何sed
方言中都不支持;但是准确表达自己想要的东西实际上会更好(即使您确实可以使用非贪婪的量词)。