[英]SED to remove a Line with REGEX Pattern
我有幾百個包含數千行的文件,我需要刪除一些跟隨模式的行,所以我用正則表達式去了SED。文件的結構是這樣的
A,12121212121212,foo,bar,lorem
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
A,21212121212121,foo,bar,lorem
C,32JL,JL
C,32JL,JL
C,32JL,JL
A,9999,88888,77777
我需要刪除所有以“ A ”開頭並以“ lorem ”結尾的行
預期產量 -
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
C,32JL,JL
A,9999,88888,77777
我做了正則表達式:
^(A).*(lorem)
它在我的文本編輯器中匹配(Sublime,UltraEdit)
在UNIX shell中
sed '/^(A).*(lorem)/d' file.txt
但不知怎的,它不起作用,它顯示整個文件,我無法弄清楚為什么。
有人能幫助我嗎?
其他人給了你正確的解決方案,但沒有解釋為什么你的正則表達式不起作用。 ()
肯定沒用,但是如果你將正則表達式與其他工具/語言一起使用,你很可能已經得到了預期的結果。
它不適用於sed
因為它默認使用POSIX的基本正則表達式 ,其中分組的字符是\\(
和\\)
,而(
和)
將匹配文字字符。 輸入文本中沒有這樣的括號,因此不匹配。
如果您使用了GNU的sed -r
或BSD的sed -E
,那么你的正則表達式就會起作用,該標志切換到POSIX的擴展正則表達式,其中(
和)
用於分組和\\(
\\)
匹配文字括號。
總之,以下命令將執行相同的操作:
sed '/^A.*lorem$/d' file.txt
sed -r '/^(A).*(lorem)$/d' file.txt
(A).*( sed -r '/^(A).*(lorem)$/d' file.txt
(使用GNU sed) sed -E '/^(A).*(lorem)$/d' file.txt
( sed -E '/^(A).*(lorem)$/d' file.txt
( sed -E '/^(A).*(lorem)$/d' file.txt
(帶有BSD sed和現代GNU sed) sed '/^\\(A\\).*\\(lorem\\)$/d' file.txt
$ sed '/^A.*lorem$/d' file.txt
^A
:開始有A
.*
:中間的東西 lorem$
:以lorem
結束 取下支架。
使用您的代碼,適當的單行成為 -
sed '/^A.*lorem/d' file.txt
如果你想要更加嚴謹,你可以看看詹姆斯的答案,它更正確地終止了正則表達式 -
sed '/^A.*lorem$/d' file.txt
兩者都有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.