2015-04-03 73 views
0

我想sed -i來更新我所有的網址縮短的HTML表單。基本上我需要從我的html表單中刪除所有action =「...」標籤中的.php。使用正則表達式來識別HTML表單操作標記

但我堅持只是識別這些實例。我想這testfile的:

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 

(我試過想後者也許我不得不逃離\中\ S)。

有人能告訴我這些命令有什麼問題嗎?

編輯:

修復1 - 顯然我需要逃避的問題作出\ S?使其被視爲可選字符而不是文字問號。

+0

引用在正則表達式中沒有任何特殊含義,它們不需要轉義。 – Barmar 2015-04-03 21:58:16

+0

@Barmar不能是真的,否則我的引號將關閉我的字符串。我在bash中這樣做。 – sunny 2015-04-03 21:59:47

+0

是的,你需要轉義雙引號以防止它關閉字符串。這與RE中沒有任何關係。 – Barmar 2015-04-03 22:00:21

回答

1

你使用它的方式,grep接受基本POSIX正則表達式的語法。單引號不需要在其中轉義,但您使用的一些元字符 - 特別是?,()|。您可以使用

grep -R "action\s\?=\s\?\(.*\)php\(\"\|'\)" testfile 

我建議,但是,您使用給予grep-E標誌擴展POSIX正則表達式語法:

grep -E -R "action\s?=\s?(.*)php(\"|')" testfile 

正如你所看到的,這使得整個事情更具有可讀性。

附錄:刪除。從一個文件中的所有動作屬性的PHP擴展,你可以使用

sed -i 's/\(action\s*=\s*["'\''][^"'\'']*\)\.php\(["'\'']\)/\1\2/g' testfile 

殼字符串使這看起來更可怕; sed的代碼只是

s/\(action\s*=\s*["'][^"']*\)\.php\(["']\)/\1\2/g 

我稍微修改了正則表達式,從而在一條線上action='foo.php' somethingelse='bar.php'.php將被刪除。我試圖儘可能保證安全,但請注意,使用sed處理HTML是always hacky

將此與find及其-exec過濾器組合以處理整個目錄。

而且雙引號需要被轉義是因爲你使用雙引號shell字符串,而不是因爲正則表達式需要它。

+0

你沒有選擇引號之前如果你檢查單個字符,使用字符組''「']'更常見 - 而不是'(」|')',所以對於它應該讀取'[\''](。*)\。php [\'']'來選擇文件名只有 – 2015-04-03 22:08:10

+0

由於'grep'給出匹配的行,所以第一個引號與'。*'匹配,而不是顯然不太可能是至關重要的。 '[\'']'是更好的風格,這是真的,也沒有必要在捕獲組中使用'。*'。可以使用'action = \ s?= \ s?[\'']。 * \。php [\'']'。 – Wintermute 2015-04-03 22:15:58

+0

@Wintermute非常感謝! – sunny 2015-04-06 14:39:09

0

試試這個轉義普通的正則表達式,只選擇引號內的文字:

action\s?=\s?["'](.*)\.php["'] 

,你可以在這裏反覆折騰:

https://regex101.com/r/lN8iG0/1

命令行這將是:

grep -P "action\s?=\s?[\"'](.*)\.php[\"']" test 
+0

您需要轉義外殼的雙引號,但不要使用單引號。 – Barmar 2015-04-03 22:03:34

+0

第一行只有正則表達式(正如用在正則表達式的提琴手中)命令行版本低於 – 2015-04-03 22:08:50

+0

我在寫第二行之前寫了我的評論 – Barmar 2015-04-03 22:11:06

0

您需要使用-P選項使用Perl regexs:

$ grep -P "action\s?=\s?(.*)php(\"|\')" test 
action = "yo.php" 
action = 'test.php' 
action='test.php' 
action="upup.php"