我正在尝试sed -i更新所有html表单以进行网址缩短。基本上我需要从所有动作中删除.php =" ..."我的html表单中的标签。
但我只是在识别这些实例。我正在尝试这个测试文件:
action = "yo.php"
action = 'test.php'
action='test.php'
action="upup.php"
我正在使用这个表达式:
grep -R "action\s?=\s?(.*)php(\"|\')" testfile
grep根本不会返回任何内容。
我尝试了很多变化,我甚至可以看到\ s?没有工作因为这个grep命令也没有返回任何内容:
grep -R "action\s?=\s?" testfile
grep -R "action\\s?=\\s?" testfile
(后者我试过想也许我不得不逃避\中的\。)
有人能告诉我这些命令有什么问题吗?
编辑:
修复1 - 显然我需要在\ s中逃避问题make?使它被视为可选字符而不是文字问号。
答案 0 :(得分:1)
您使用它的方式,grep
接受基本的posix正则表达式语法。单引号不需要在其中转义 1 ,但您使用的某些元字符可以进行转义 - 尤其是?
,()
和{{1} }。你可以使用
|
但是,我建议您使用grep -R "action\s\?=\s\?\(.*\)php\(\"\|'\)" testfile
grep
标记来使用扩展的posix正则表达式语法:
-E
正如您所看到的,这使整个事情更具可读性。
附录:要从文件中的所有操作属性中删除.php扩展名,可以使用
grep -E -R "action\s?=\s?(.*)php(\"|')" testfile
贝壳琴弦使它看起来比它更可怕; sed代码就是
sed -i 's/\(action\s*=\s*["'\''][^"'\'']*\)\.php\(["'\'']\)/\1\2/g' testfile
我稍微修改了正则表达式,以便在行s/\(action\s*=\s*["'][^"']*\)\.php\(["']\)/\1\2/g
中删除右action='foo.php' somethingelse='bar.php'
。我尝试尽可能安全,但要注意使用sed处理HTML是always hacky。
将其与.php
及其find
过滤器结合使用,以处理整个目录。
1 并且需要转义的双引号是因为你使用双引号shell字符串,而不是因为正则表达式需要它。
答案 1 :(得分:0)
尝试使用未转义的普通正则表达式,它只选择引号内的文字:
action\s?=\s?["'](.*)\.php["']
你可以在这里乱搞:
https://regex101.com/r/lN8iG0/1
依此命令行,这将是:
grep -P "action\s?=\s?[\"'](.*)\.php[\"']" test
答案 2 :(得分:0)
您需要使用-P
选项来使用Perl正则表达式:
$ grep -P "action\s?=\s?(.*)php(\"|\')" test
action = "yo.php"
action = 'test.php'
action='test.php'
action="upup.php"