簡體   English   中英

無法使上述正則表達式在 sed 命令中工作

[英]Unable to make the mentioned regular expression to work in sed command

我正在嘗試使以下正則表達式在 bash 中的sed命令中工作。

^[^<]?(https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*))[^>]?$

我知道正則表達式是正確的,它按我的預期工作。 所以; 不需要幫助。 我在在線正則表達式測試器上對其進行了測試,它按照我的預期工作。

請在此處找到上述正則表達式的演示。

我的要求:我想將每個 url 包含在<>中。 如果 url 已封裝; 然后 append 它的結果可以在上面的正則表達式鏈接中看到。

示例輸入:(在名為 website.txt 的文件中)

// List of all legal urls
https://www.google.com/
https://www.fakesite.co.in
https://www.fakesite.co.uk
<https://www.fakesite.co.uk>
<https://www.google.com/>

預期 Output:(在名為 output.txt 的文件中)

<https://www.google.com/> // Please notice every url is enclosed in the <>.
<https://www.fakesite.co.in>
<https://www.fakesite.co.uk>
<https://www.fakesite.co.uk> // Please notice if the url is already enclosed in <> then it is appended as it is.
<https://www.google.com/>

我在 sed 中嘗試過的內容:

  1. 由於我不精通 bash 命令; 所以以前我無法在sed中正確捕獲該組,但在閱讀了這個答案之后; 我發現我們需要轉義括號才能捕獲它。

  2. 某處; 我讀到sed (基於 GNU)不支持環視,所以我也刪除了環視; 但這也沒有用。 如果它不支持環視,那么我使用了這個正則表達式,它達到了我的目的。

  3. 然后; 這是我對sed命令的最新嘗試:

     sed 's@^[^<]?(https?://(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&/=]*))[^>]?$@<\1>@gm;t;d' websites.txt > output.txt

我的確切問題:

如何使上述命令正常工作。 如果您要運行我在上面第 3 點附加的命令示例; 您會看到它沒有正確替換內容。 它只是將output.txt websites.txt 但是在正則表達式演示中; 附加在它上面的工作正常,即將所有未封閉的網站包含在<>中。 任何的意見都將會有幫助。 我最好在 sed 中使用它,但如果可能的話,我可以在 awk 中轉換上述命令嗎? 如果你也可以請幫助我; 我將非常感激。 謝謝

經過長時間的工作,我讓我的 sed 命令工作。 以下是有效的命令。

sed -E 's@^[^<]?(https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&=]*))[^>]?$@<\1>@gm;t' websites.txt > output.txt

您可以在此處找到該命令的示例實現。

因為,正則表達式已經滿足了我為其編寫此要求的人的要求; 我只需要獲得有關命令語法的幫助(盡管任何改進都受到熱烈歡迎); 我希望該命令使用相同的正則表達式模式。

我以前不知道現在學到的東西:

  1. 我對-E標志一無所知。 現在我知道了; -E使用 POSIX “擴展”語法(“ERE”)。 感謝@GordonDavisson@Sundeep 進一步閱讀。

  2. 我不清楚 sed 不支持環視。 但現在我知道 sed 不支持環視。 感謝@dmitri-chubarov 進一步閱讀

  3. 我不知道 sed 也不支持非捕獲組。 感謝@Sundeep解決了這部分問題。 延伸閱讀

  4. 我不知道 GNU sed 作為一個特定的命令行工具。 感謝@oguzismail 進一步閱讀。

關於您回答中的命令:

sed -E 's@^[^<]?(https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&=]*))[^>]?$@<\1>@gm;t'

這里有一些注意事項:

您發布的示例輸入每行有 1 個 URL 所以 AFAIK gm;t在您的 sed 命令末尾沒有做任何有用的事情,因此您的輸入不足或腳本錯誤。

硬編碼范圍azAZ0-9包含不同語言環境中的不同字符。 如果您打算包含所有(且僅)小寫字母、大寫字母和數字,則應將a-zA-Z0-9替換為 POSIX 字符 class [:alnum:] 因此,要么更改為使用與區域設置無關的字符 class,要么根據您在正則表達式中匹配字符的要求在命令行上指定您需要的區域設置。

像大多數字符一樣,字符+是括號表達式中的文字,因此不應轉義 - 將\+更改為+

括號表達式[^<]? 表示“任何不是< ”的字符出現 1 次或 0 次,對於[^>]? 因此,如果您的“url”在開始/結束時包含隨機字符,它將被接受,例如:

echo 'xhttp://foo.bar%' | sed -E 's@^[^<]?(https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&=]*))[^>]?$@<\1>@gm;t'
<http://foo.bar%>

你的意思是使用<? >? 而不是[^<]? [^>]? .

您的正則表達式將允許沒有字母的“url”:

echo 'http://=.9' | gsed -E 's@^[^<]?(https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&=]*))[^>]?$@<\1>@gm;t'
<http://=.9>

如果您編輯您的問題以提供更具代表性的示例輸入和預期的 output(包括您不想匹配的案例),那么我們可以幫助您,但基於快速谷歌搜索什么是有效的 URL 看起來有幾個有效的 URL這將被您的正則表達式和幾個允許的無效表達式所禁止,因此您可能想在帶有url或類似標簽的問題中詢問這個問題(使用您當前擁有的標簽,我們可以幫助您實現您的正則表達式,但可能成為更好的人來幫助定義您的正則表達式)。

如果輸入文件只是一個注釋,后跟一個 URL 列表,請嘗試:

sed '1d;s/^[^<]/<&/;s/[^>]$/&>/' websites.txt

Output:

<https://www.google.com/>
<https://www.fakesite.co.in>
<https://www.fakesite.co.uk>
<https://www.fakesite.co.uk>
<https://www.google.com/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM