簡體   English   中英

SED刪除帶有REGEX模式的行

[英]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.

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